<!DOCTYPE html>
<html lang="zh-CN" dir="ltr">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>线程池 | 陆远的知识库</title>
    <meta name="description" content="个人技术知识库，记录 & 分享个人碎片化、结构化、体系化的技术知识内容。">
    <meta name="generator" content="VitePress v1.0.2">
    <link rel="preload stylesheet" href="/assets/style.BeCcSLxA.css" as="style">
    
    <script type="module" src="/assets/app.CVNatGFy.js"></script>
    <link rel="preload" href="/assets/inter-roman-latin.Bu8hRsVA.woff2" as="font" type="font/woff2" crossorigin="">
    <link rel="modulepreload" href="/assets/chunks/framework.BG61BEI0.js">
    <link rel="modulepreload" href="/assets/chunks/theme.DLNQOf2l.js">
    <link rel="modulepreload" href="/assets/01-Dev_01.01-Java_JUC_01-并发编程_并发编程-02.md.CFn--oRQ.lean.js">
    <link href="/favicon.jpg">
    <script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
    <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
  </head>
  <body>
    <div id="app"><div class="Layout" data-v-8bc02b95><!--[--><!--]--><!--[--><span tabindex="-1" data-v-5acf5501></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-5acf5501> Skip to content </a><!--]--><!----><header class="VPNav" data-v-8bc02b95 data-v-87a6899a><div class="VPNavBar has-sidebar top" data-v-87a6899a data-v-c3151ff2><div class="wrapper" data-v-c3151ff2><div class="container" data-v-c3151ff2><div class="title" data-v-c3151ff2><div class="VPNavBarTitle has-sidebar" data-v-c3151ff2 data-v-52673e39><a class="title" href="/" data-v-52673e39><!--[--><!--]--><!--[--><img class="VPImage logo" src="/favicon.jpg" alt data-v-53bbf572><!--]--><span data-v-52673e39>陆远的知识库</span><!--[--><!--]--></a></div></div><div class="content" data-v-c3151ff2><div class="content-body" data-v-c3151ff2><!--[--><!--]--><div class="VPNavBarSearch search" data-v-c3151ff2><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-c3151ff2 data-v-57d2160f><span id="main-nav-aria-label" class="visually-hidden" data-v-57d2160f>Main Navigation</span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/" tabindex="0" data-v-57d2160f data-v-d56c0fcb><!--[--><span data-v-d56c0fcb>🚀首页</span><!--]--></a><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-57d2160f data-v-d18fe690><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-d18fe690><span class="text" data-v-d18fe690><!----><span data-v-d18fe690>🌱指南</span><span class="vpi-chevron-down text-icon" data-v-d18fe690></span></span></button><div class="menu" data-v-d18fe690><div class="VPMenu" data-v-d18fe690 data-v-bedc9cd4><div class="items" data-v-bedc9cd4><!--[--><!--[--><div class="VPMenuGroup" data-v-bedc9cd4 data-v-a1ad9fbb><p class="title" data-v-a1ad9fbb>Dev</p><!--[--><!--[--><div class="VPMenuLink" data-v-a1ad9fbb data-v-189719a1><a class="VPLink link" href="/01-Dev/" data-v-189719a1><!--[-->Dev<!--]--></a></div><!--]--><!--]--></div><!--]--><!--[--><div class="VPMenuGroup" data-v-bedc9cd4 data-v-a1ad9fbb><p class="title" data-v-a1ad9fbb>个人</p><!--[--><!--[--><div class="VPMenuLink" data-v-a1ad9fbb data-v-189719a1><a class="VPLink link" href="/02-Person/SEO/" data-v-189719a1><!--[-->SEO<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-a1ad9fbb data-v-189719a1><a class="VPLink link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/%E7%AE%80%E4%BB%8B.html" data-v-189719a1><!--[-->业务学习<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-a1ad9fbb data-v-189719a1><a class="VPLink link" href="/02-Person/博客搭建/" data-v-189719a1><!--[-->博客搭建<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-a1ad9fbb data-v-189719a1><a class="VPLink link" href="/02-Person/博文成长/" data-v-189719a1><!--[-->博文成长<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-a1ad9fbb data-v-189719a1><a class="VPLink link" href="/02-Person/独立开发者/" data-v-189719a1><!--[-->独立开发者<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-a1ad9fbb data-v-189719a1><a class="VPLink link" href="/02-Person/问题思考/" data-v-189719a1><!--[-->问题思考<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-57d2160f data-v-d18fe690><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-d18fe690><span class="text" data-v-d18fe690><!----><span data-v-d18fe690>🏷️归档</span><span class="vpi-chevron-down text-icon" data-v-d18fe690></span></span></button><div class="menu" data-v-d18fe690><div class="VPMenu" data-v-d18fe690 data-v-bedc9cd4><div class="items" data-v-bedc9cd4><!--[--><!--[--><div class="VPMenuLink" data-v-bedc9cd4 data-v-189719a1><a class="VPLink link" href="/05-Category/" data-v-189719a1><!--[-->🚩分类<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-bedc9cd4 data-v-189719a1><a class="VPLink link" href="/06-Tags/" data-v-189719a1><!--[-->🏷️标签<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-57d2160f data-v-d18fe690><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-d18fe690><span class="text" data-v-d18fe690><!----><span data-v-d18fe690>💫关于</span><span class="vpi-chevron-down text-icon" data-v-d18fe690></span></span></button><div class="menu" data-v-d18fe690><div class="VPMenu" data-v-d18fe690 data-v-bedc9cd4><div class="items" data-v-bedc9cd4><!--[--><!--[--><div class="VPMenuLink" data-v-bedc9cd4 data-v-189719a1><a class="VPLink link" href="/04-Team/" data-v-189719a1><!--[-->🦁团队<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-bedc9cd4 data-v-189719a1><a class="VPLink link" href="/03-Me/" data-v-189719a1><!--[-->💫关于我<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-bedc9cd4 data-v-189719a1><a class="VPLink link" href="/support.html" data-v-189719a1><!--[-->💸支持<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-bedc9cd4 data-v-189719a1><a class="VPLink link" href="/rss.xml" data-v-189719a1><!--[-->🔊RSS订阅<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-c3151ff2 data-v-8e1a18c0><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="切换到深色模式" aria-checked="false" data-v-8e1a18c0 data-v-c2b25b84 data-v-b065eea2><span class="check" data-v-b065eea2><span class="icon" data-v-b065eea2><!--[--><span class="vpi-sun sun" data-v-c2b25b84></span><span class="vpi-moon moon" data-v-c2b25b84></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-c3151ff2 data-v-54107397 data-v-e1be45b8><!--[--><a class="VPSocialLink no-icon" href="https://github.com/luyuan9870" aria-label="github" target="_blank" rel="noopener" data-v-e1be45b8 data-v-6cc961c3><span class="vpi-social-github" /></a><a class="VPSocialLink no-icon" href="https://gitee.com/luyuan9870" aria-label target="_blank" rel="noopener" data-v-e1be45b8 data-v-6cc961c3><svg t="1710470546803" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1442" width="200" height="200"><path d="M512 512m-494.933333 0a494.933333 494.933333 0 1 0 989.866666 0 494.933333 494.933333 0 1 0-989.866666 0Z" fill="#C71D23" p-id="1443"></path><path d="M762.538667 457.045333h-281.088a24.4736 24.4736 0 0 0-24.439467 24.405334v61.098666c-0.034133 13.5168 10.922667 24.439467 24.405333 24.439467h171.1104c13.5168 0 24.439467 10.922667 24.439467 24.439467v12.219733a73.3184 73.3184 0 0 1-73.3184 73.3184h-232.209067a24.439467 24.439467 0 0 1-24.439466-24.439467v-232.174933a73.3184 73.3184 0 0 1 73.3184-73.3184h342.152533c13.482667 0 24.405333-10.922667 24.439467-24.439467l0.034133-61.098666a24.405333 24.405333 0 0 0-24.405333-24.439467H420.352a183.296 183.296 0 0 0-183.296 183.296V762.538667c0 13.482667 10.922667 24.439467 24.405333 24.439466h360.516267a164.9664 164.9664 0 0 0 165.000533-165.000533v-140.526933a24.439467 24.439467 0 0 0-24.439466-24.439467z" fill="#FFFFFF" p-id="1444"></path></svg></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-c3151ff2 data-v-5811488c data-v-d18fe690><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-d18fe690><span class="vpi-more-horizontal icon" data-v-d18fe690></span></button><div class="menu" data-v-d18fe690><div class="VPMenu" data-v-d18fe690 data-v-bedc9cd4><!----><!--[--><!--[--><!----><div class="group" data-v-5811488c><div class="item appearance" data-v-5811488c><p class="label" data-v-5811488c>浅/深色模式切换</p><div class="appearance-action" data-v-5811488c><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="切换到深色模式" aria-checked="false" data-v-5811488c data-v-c2b25b84 data-v-b065eea2><span class="check" data-v-b065eea2><span class="icon" data-v-b065eea2><!--[--><span class="vpi-sun sun" data-v-c2b25b84></span><span class="vpi-moon moon" data-v-c2b25b84></span><!--]--></span></span></button></div></div></div><div class="group" data-v-5811488c><div class="item social-links" data-v-5811488c><div class="VPSocialLinks social-links-list" data-v-5811488c data-v-e1be45b8><!--[--><a class="VPSocialLink no-icon" href="https://github.com/luyuan9870" aria-label="github" target="_blank" rel="noopener" data-v-e1be45b8 data-v-6cc961c3><span class="vpi-social-github" /></a><a class="VPSocialLink no-icon" href="https://gitee.com/luyuan9870" aria-label target="_blank" rel="noopener" data-v-e1be45b8 data-v-6cc961c3><svg t="1710470546803" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1442" width="200" height="200"><path d="M512 512m-494.933333 0a494.933333 494.933333 0 1 0 989.866666 0 494.933333 494.933333 0 1 0-989.866666 0Z" fill="#C71D23" p-id="1443"></path><path d="M762.538667 457.045333h-281.088a24.4736 24.4736 0 0 0-24.439467 24.405334v61.098666c-0.034133 13.5168 10.922667 24.439467 24.405333 24.439467h171.1104c13.5168 0 24.439467 10.922667 24.439467 24.439467v12.219733a73.3184 73.3184 0 0 1-73.3184 73.3184h-232.209067a24.439467 24.439467 0 0 1-24.439466-24.439467v-232.174933a73.3184 73.3184 0 0 1 73.3184-73.3184h342.152533c13.482667 0 24.405333-10.922667 24.439467-24.439467l0.034133-61.098666a24.405333 24.405333 0 0 0-24.405333-24.439467H420.352a183.296 183.296 0 0 0-183.296 183.296V762.538667c0 13.482667 10.922667 24.439467 24.405333 24.439466h360.516267a164.9664 164.9664 0 0 0 165.000533-165.000533v-140.526933a24.439467 24.439467 0 0 0-24.439466-24.439467z" fill="#FFFFFF" p-id="1444"></path></svg></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-c3151ff2 data-v-8a3583f8><span class="container" data-v-8a3583f8><span class="top" data-v-8a3583f8></span><span class="middle" data-v-8a3583f8></span><span class="bottom" data-v-8a3583f8></span></span></button></div></div></div></div><div class="divider" data-v-c3151ff2><div class="divider-line" data-v-c3151ff2></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-8bc02b95 data-v-14b6d604><div class="container" data-v-14b6d604><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-14b6d604><span class="vpi-align-left menu-icon" data-v-14b6d604></span><span class="menu-text" data-v-14b6d604>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-14b6d604 data-v-a4ccfa00><button data-v-a4ccfa00>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-8bc02b95 data-v-730aa0ad><div class="curtain" data-v-730aa0ad></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-730aa0ad><span class="visually-hidden" id="sidebar-aria-label" data-v-730aa0ad> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="group" data-v-730aa0ad><section class="VPSidebarItem level-0 collapsible collapsed" data-v-730aa0ad data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h2 class="text" data-v-feaad427>01 Dev</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.01 Java</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>Cloud</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><section class="VPSidebarItem level-3 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h5 class="text" data-v-feaad427>Alibaba</h5><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><section class="VPSidebarItem level-4 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h6 class="text" data-v-feaad427>Nacos</h6><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-5 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/Cloud/Alibaba/Nacos/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>源码分析</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-4 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/Cloud/Alibaba/%E7%BB%84%E4%BB%B6.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>组件</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/Cloud/Higress.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Higress</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/index.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Index</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>Java基础</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/Java%E5%9F%BA%E7%A1%80/Serializable.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Serializable</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/Java%E5%9F%BA%E7%A1%80/%E6%B3%9B%E5%9E%8B.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>泛型</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>JUC</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><section class="VPSidebarItem level-3 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h5 class="text" data-v-feaad427>01 并发编程</h5><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-4 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/JUC/01-%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-01.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>并发编程 01</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-4 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/JUC/01-%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-02.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>并发编程 02</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/JUC/Condition%E6%8E%A5%E5%8F%A3.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Condition接口</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/JUC/Future.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Future</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/JUC/Volatile%E5%85%B3%E9%94%AE%E5%AD%97.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Volatile关键字</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/JUC/%E4%BF%A1%E5%8F%B7%E9%87%8F.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>信号量</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/JUC/%E5%A4%9A%E7%BA%BF%E7%A8%8B.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>多线程</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/JUC/%E7%BA%BF%E7%A8%8B%E6%B1%A0.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>线程池</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/JUC/%E9%94%81.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>锁</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>JVM</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/JVM/00-%E5%89%8D%E8%A8%80.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>00 前言</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/JVM/01-%E7%B1%BB%E5%8A%A0%E8%BD%BD%E6%9C%BA%E5%88%B6.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>01 类加载机制</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/JVM/02-%E8%BF%90%E8%A1%8C%E6%97%B6%E6%95%B0%E6%8D%AE%E5%8C%BA.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>02 运行时数据区</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/JVM/03-JVM%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>03 JVM内存模型</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/JVM/04-JVM%E7%9A%84%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E7%AE%97%E6%B3%95.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>04 JVM的垃圾收集算法</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/JVM/05-%E5%8F%8C%E4%BA%B2%E5%A7%94%E6%B4%BE%E6%A8%A1%E5%9E%8B.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>05 双亲委派模型</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/JVM/06-Java%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B%E5%B8%83%E5%B1%80.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>06 Java对象的内存模型布局</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.01-Java/%E7%B3%BB%E7%BB%9F%E4%BC%98%E5%8C%96.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>系统优化</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.02 前端</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.02-%E5%89%8D%E7%AB%AF/01-%E5%89%8D%E7%AB%AF%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>01 前端学习路线</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.02-%E5%89%8D%E7%AB%AF/02-%E5%B8%B8%E7%94%A8%E4%BB%A3%E7%A0%81%E6%AE%B5.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>02 常用代码段</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>Npm</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.02-%E5%89%8D%E7%AB%AF/Npm/Npm%E9%95%9C%E5%83%8F%E5%88%87%E6%8D%A2.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Npm镜像切换</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.02-%E5%89%8D%E7%AB%AF/Npm/pnpm.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Pnpm</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>Vue</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.02-%E5%89%8D%E7%AB%AF/Vue/00-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>00 快速入门</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.02-%E5%89%8D%E7%AB%AF/Vue/01-%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>01 基础语法</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.02-%E5%89%8D%E7%AB%AF/%E7%96%91%E9%97%AE.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>疑问</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.03 网络安全</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.03-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/00-%E5%A4%A7%E7%BA%B2%E8%B7%AF%E7%BA%BF.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>00 大纲路线</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.03-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/00-%E5%B8%B8%E7%94%A8%E7%BD%91%E7%AB%99.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>00 常用网站</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.03-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/01-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E7%AE%80%E4%BB%8B.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>01 网络安全简介</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.03-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/02-%E5%B8%B8%E8%A7%81%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>02 常见安全问题</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>安全漏洞</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.03-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/%E5%AE%89%E5%85%A8%E6%BC%8F%E6%B4%9E/FastJSON%E5%BA%8F%E5%88%97%E5%8C%96%E8%BF%9C%E7%A8%8B%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>FastJSON序列化远程执行漏洞</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.03-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/%E5%AE%89%E5%85%A8%E6%BC%8F%E6%B4%9E/Nacos-2.1%E4%BB%A5%E4%B8%8B%E7%9A%84%E6%9C%AA%E6%8E%88%E6%9D%83%E8%AE%BF%E9%97%AE%E6%BC%8F%E6%B4%9E.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Nacos 2.1以下的未授权访问漏洞</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.04 计算机基础</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>基础数据结构</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E5%9F%BA%E7%A1%80%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E5%B0%8F%E9%99%88.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>小陈</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E5%9F%BA%E7%A1%80%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E9%93%BE%E8%A1%A8.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>链表</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>系统设计</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/DDD%E6%98%AF%E4%BB%80%E4%B9%88.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>DDD是什么</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>计算机组成原理</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E4%BB%80%E4%B9%88%E6%98%AF%E5%81%8F%E7%A7%BB%E9%87%8F.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>什么是偏移量</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>计算机网络</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE-TCP-IP.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>网络协议 TCP IP</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E9%B8%9F%E5%93%A5%E7%A7%81%E6%88%BF%E8%8F%9C.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>鸟哥私房菜</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.05 设计模式</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>01 深入设计模式</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.05-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/01-%E6%B7%B1%E5%85%A5%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/01-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E7%AE%80%E4%BB%8B.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>01 面向对象程序设计简介</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.05-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E3%80%8A%E7%BE%8E%E5%9B%A2%E6%8A%80%E6%9C%AF%E3%80%8B%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E5%9C%A8%E5%A4%96%E5%8D%96%E8%90%A5%E9%94%80%E4%B8%9A%E5%8A%A1%E4%B8%AD%E7%9A%84%E5%AE%9E%E8%B7%B5.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>《美团技术》设计模式在外卖营销业务中的实践</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>创建型</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.05-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E5%88%9B%E5%BB%BA%E5%9E%8B/%E5%8D%95%E4%BE%8B.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>单例</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.05-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E5%89%8D%E8%A8%80.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>前言</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.05-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E6%B6%89%E5%8F%8A%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>涉及设计模式</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>结构型</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.05-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E7%BB%93%E6%9E%84%E5%9E%8B/%E4%BB%A3%E7%90%86.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>代理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.05-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E7%BB%93%E6%9E%84%E5%9E%8B/%E9%97%A8%E9%9D%A2.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>门面</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>行为型</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.05-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E8%A1%8C%E4%B8%BA%E5%9E%8B/%E6%A8%A1%E6%9D%BF.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>模板</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.05-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E8%A1%8C%E4%B8%BA%E5%9E%8B/%E7%AD%96%E7%95%A5.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>策略</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.05-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E8%A1%8C%E4%B8%BA%E5%9E%8B/%E8%B4%A3%E4%BB%BB%E9%93%BE.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>责任链</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.06 算法</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.06-%E7%AE%97%E6%B3%95/01-%E5%89%8D%E8%A8%80.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>01 前言</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.06-%E7%AE%97%E6%B3%95/02-%E5%AF%BC%E8%AF%BB.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>02 导读</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>业务算法</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.06-%E7%AE%97%E6%B3%95/%E4%B8%9A%E5%8A%A1%E7%AE%97%E6%B3%95/DFA.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>DFA</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.06-%E7%AE%97%E6%B3%95/%E4%B8%9A%E5%8A%A1%E7%AE%97%E6%B3%95/%E8%A3%85%E7%AE%B1%E7%AE%97%E6%B3%95.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>装箱算法</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.06-%E7%AE%97%E6%B3%95/%E4%BA%8C%E5%88%86.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>二分</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.06-%E7%AE%97%E6%B3%95/%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>基础知识</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>排序</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.06-%E7%AE%97%E6%B3%95/%E6%8E%92%E5%BA%8F/%E5%86%92%E6%B3%A1.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>冒泡</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.06-%E7%AE%97%E6%B3%95/%E6%8E%92%E5%BA%8F/%E6%8F%92%E5%85%A5.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>插入</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.06-%E7%AE%97%E6%B3%95/%E6%8E%92%E5%BA%8F/%E9%80%89%E6%8B%A9.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>选择</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.06-%E7%AE%97%E6%B3%95/%E7%AE%97%E6%B3%95%E8%B7%AF%E7%BA%BF.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>算法路线</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.07 Linux</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.07-Linux/Linux%E8%87%AA%E5%AE%9A%E4%B9%89%E7%B3%BB%E7%BB%9F%E6%9C%8D%E5%8A%A1-%E6%9C%8D%E5%8A%A1%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99%EF%BC%88%E5%BC%80%E6%9C%BA%E8%87%AA%E5%90%AF%EF%BC%89.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Linux自定义系统服务 服务脚本编写（开机自启）</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.07-Linux/%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>常用命令</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>环境安装</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.07-Linux/%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85/Linux%E5%AE%89%E8%A3%85docker.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Linux安装docker</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.07-Linux/%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85/Linux%E5%AE%89%E8%A3%85jdk.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Linux安装jdk</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.07-Linux/%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85/Ubuntu%E5%9F%BA%E7%A1%80%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Ubuntu基础环境安装</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.07-Linux/%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85/%E5%9F%BA%E7%A1%80%E7%8E%AF%E5%A2%83%E9%97%AE%E9%A2%98.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>基础环境问题</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>虚拟机</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.07-Linux/%E8%99%9A%E6%8B%9F%E6%9C%BA/VirtualBox.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>VirtualBox</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.07-Linux/%E8%99%9A%E6%8B%9F%E6%9C%BA/windows%E5%AE%89%E8%A3%85linux%E5%AD%90%E7%B3%BB%E7%BB%9F.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Windows安装linux子系统</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.08 数据库</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>00 《MySQL是怎么运行的》</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.08-%E6%95%B0%E6%8D%AE%E5%BA%93/00-%E3%80%8AMySQL%E6%98%AF%E6%80%8E%E4%B9%88%E8%BF%90%E8%A1%8C%E7%9A%84%E3%80%8B/01-%E3%80%8A%E8%A3%85%E4%BD%9C%E8%87%AA%E5%B7%B1%E6%98%AF%E4%B8%AA%E5%B0%8F%E7%99%BD%E3%80%8B-%E5%88%9D%E8%AF%86MySQL.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>01 《装作自己是个小白》 初识MySQL</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.08-%E6%95%B0%E6%8D%AE%E5%BA%93/00-%E3%80%8AMySQL%E6%98%AF%E6%80%8E%E4%B9%88%E8%BF%90%E8%A1%8C%E7%9A%84%E3%80%8B/02-%E3%80%8AMysql%E7%9A%84%E8%B0%83%E6%8E%A7%E6%8C%89%E9%92%AE%E3%80%8B-%E5%90%AF%E5%8A%A8%E9%80%89%E9%A1%B9%E4%B8%8E%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>02 《Mysql的调控按钮》 启动选项与环境变量</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.08-%E6%95%B0%E6%8D%AE%E5%BA%93/00-%E3%80%8AMySQL%E6%98%AF%E6%80%8E%E4%B9%88%E8%BF%90%E8%A1%8C%E7%9A%84%E3%80%8B/03-%E3%80%8A%E4%B9%B1%E7%A0%81%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F%E3%80%8B-%E5%AD%97%E7%AC%A6%E9%9B%86%E5%92%8C%E6%AF%94%E8%BE%83%E8%A7%84%E5%88%99.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>03 《乱码的前世今生》 字符集和比较规则</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.08-%E6%95%B0%E6%8D%AE%E5%BA%93/00-%E3%80%8AMySQL%E6%98%AF%E6%80%8E%E4%B9%88%E8%BF%90%E8%A1%8C%E7%9A%84%E3%80%8B/04-%E3%80%8A%E4%BB%8E%E4%B8%80%E6%9D%A1%E8%AE%B0%E5%BD%95%E8%AF%B4%E8%B5%B7%E3%80%8B-InnoDB%E8%AE%B0%E5%BD%95%E7%BB%93%E6%9E%84.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>04 《从一条记录说起》 InnoDB记录结构</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>01 《Mysql BinLog神秘面纱》</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.08-%E6%95%B0%E6%8D%AE%E5%BA%93/01-%E3%80%8AMysql-BinLog%E7%A5%9E%E7%A7%98%E9%9D%A2%E7%BA%B1%E3%80%8B/01-MySQL-BinLog.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>01 MySQL BinLog</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>02 Mysql</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.08-%E6%95%B0%E6%8D%AE%E5%BA%93/02-Mysql/MySQL%E6%95%B4%E4%BD%93%E6%9E%B6%E6%9E%84%E8%A7%A3%E6%9E%90.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>MySQL整体架构解析</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.08-%E6%95%B0%E6%8D%AE%E5%BA%93/02-Mysql/Mysql%E7%89%B9%E6%AE%8A%E5%91%BD%E4%BB%A4.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Mysql特殊命令</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.08-%E6%95%B0%E6%8D%AE%E5%BA%93/02-Mysql/%E7%A2%8E%E7%89%87%E6%B8%85%E7%90%86%E6%96%B9%E6%A1%88.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>碎片清理方案</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.08-%E6%95%B0%E6%8D%AE%E5%BA%93/02-Mysql/%E9%97%AE%E9%A2%98%E5%BC%95%E5%AF%BC%E5%AD%A6%E4%B9%A0.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>问题引导学习</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>03 Redis</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.08-%E6%95%B0%E6%8D%AE%E5%BA%93/03-Redis/Redis-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Redis 入门基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.08-%E6%95%B0%E6%8D%AE%E5%BA%93/03-Redis/Redis.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Redis</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.09 Docker</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>01 DockerCompose</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.09-Docker/01-DockerCompose/%E5%B8%B8%E7%94%A8-%E7%8E%AF%E5%A2%83%E6%9C%8D%E5%8A%A1-DockerFile.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>常用 环境服务 DockerFile</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.09-Docker/Docker%E5%91%BD%E4%BB%A4.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Docker命令</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>Docker软件安装</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.09-Docker/docker%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/MinIo.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>MinIo</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.09-Docker/%E4%BB%8E%E9%9B%B6%E5%AD%A6Docker.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>从零学Docker</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.12 DevOps</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.12-DevOps/Jenkins.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Jenkins</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.12-DevOps/%E4%BA%91%E6%95%88%E6%B5%81%E6%B0%B4%E7%BA%BF%E6%9E%84%E5%BB%BA.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>云效流水线构建</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.12-DevOps/%E5%89%8D%E8%A8%80.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>前言</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.13 Es</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.13-Es/00-docker%E6%96%B9%E5%BC%8F%E5%AE%89%E8%A3%85%E5%8D%95%E6%9C%BA%E7%89%88es%E3%80%81kibana%E3%80%81ik%E5%88%86%E8%AF%8D%E3%80%81%E5%8F%AF%E8%A7%86%E5%8C%96.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>00 docker方式安装单机版es、kibana、ik分词、可视化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.13-Es/01-ES%E5%85%A5%E9%97%A8.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>01 ES入门</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.13-Es/02-Spring%E6%95%B4%E5%90%88Es.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>02 Spring整合Es</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.13-Es/03-Es%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5%E9%97%AE%E9%A2%98.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>03 Es数据同步问题</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.14 Job</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.14-Job/00-Docker%E9%95%9C%E5%83%8F%E6%96%B9%E5%BC%8F%E6%90%AD%E5%BB%BA%E8%B0%83%E5%BA%A6%E4%B8%AD%E5%BF%83.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>00 Docker镜像方式搭建调度中心</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.14-Job/PowerJob.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>PowerJob</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.60 书籍相关</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>《如何学习业务》</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.60-%E4%B9%A6%E7%B1%8D%E7%9B%B8%E5%85%B3/%E3%80%8A%E5%A6%82%E4%BD%95%E5%AD%A6%E4%B9%A0%E4%B8%9A%E5%8A%A1%E3%80%8B/%E5%A6%82%E4%BD%95%E5%AD%A6%E4%B9%A0%E4%B8%9A%E5%8A%A1.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>如何学习业务</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.60-%E4%B9%A6%E7%B1%8D%E7%9B%B8%E5%85%B3/%E7%BB%8F%E5%85%B8%E7%BC%96%E7%A8%8B%E4%B9%A6%E5%8D%95500MB.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>经典编程书单500MB</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.68 DDD</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.68-DDD/%E5%85%85%E8%A1%80%E6%A8%A1%E5%9E%8B%E4%B8%8E%E8%B4%AB%E8%A1%80%E6%A8%A1%E5%9E%8B.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>充血模型与贫血模型</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.69 技术规范</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.69-%E6%8A%80%E6%9C%AF%E8%A7%84%E8%8C%83/01-%E6%8E%A2%E7%B4%A2%E6%97%A5%E5%BF%97%E8%A7%84%E7%BA%A6.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>01 探索日志规约</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.70 业务解决方案</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.70-%E4%B8%9A%E5%8A%A1%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/DO%E5%AF%B9%E8%B1%A1%E5%B5%8C%E5%A5%97%E7%9A%84%E7%89%B9%E6%AE%8A%E5%A4%84%E7%90%86.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>DO对象嵌套的特殊处理</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>SpringBoot</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.70-%E4%B8%9A%E5%8A%A1%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/SpringBoot/Event%E8%A7%82%E5%AF%9F%E8%80%85.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Event观察者</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.70-%E4%B8%9A%E5%8A%A1%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/SpringBoot/SpEL%E8%A1%A8%E8%BE%BE%E5%BC%8F.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>SpEL表达式</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.70-%E4%B8%9A%E5%8A%A1%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/SpringBoot/SpringBoot-Start.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>SpringBoot Start</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.70-%E4%B8%9A%E5%8A%A1%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/SpringBoot/SpringBootApplication%E6%B3%A8%E8%A7%A3.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>SpringBootApplication注解</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-3 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h5 class="text" data-v-feaad427>自定义 start</h5><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-4 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.70-%E4%B8%9A%E5%8A%A1%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/SpringBoot/%E8%87%AA%E5%AE%9A%E4%B9%89-start/%E6%9C%AA%E5%91%BD%E5%90%8D.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>未命名</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>加密</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.70-%E4%B8%9A%E5%8A%A1%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/%E5%8A%A0%E5%AF%86/Excel&amp;Word%E6%96%87%E4%BB%B6%E5%8A%A0%E5%AF%86.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Excel&Word文件加密</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.70-%E4%B8%9A%E5%8A%A1%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/%E5%B9%82%E7%AD%89%E5%A4%84%E7%90%86.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>幂等处理</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>日志</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.70-%E4%B8%9A%E5%8A%A1%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/%E6%97%A5%E5%BF%97/TraceId%E9%97%AE%E9%A2%98.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>TraceId问题</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.98 八股</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.98-%E5%85%AB%E8%82%A1/01-Java%E5%9F%BA%E7%A1%80%E9%9D%A2%E8%AF%95%E4%B8%93%E9%A2%98(%E4%B8%8A).html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>01 Java基础面试专题(上)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.98-%E5%85%AB%E8%82%A1/02-Java%E5%9F%BA%E7%A1%80%E9%9D%A2%E8%AF%95%E4%B8%93%E9%A2%98(%E4%B8%AD).html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>02 Java基础面试专题(中)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.98-%E5%85%AB%E8%82%A1/03-Java%E5%9F%BA%E7%A1%80%E9%9D%A2%E8%AF%95%E4%B8%93%E9%A2%98(%E4%B8%8B).html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>03 Java基础面试专题(下)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.98-%E5%85%AB%E8%82%A1/2023%E9%87%91%E4%B9%9D%E9%93%B6%E5%8D%81%E9%9D%A2%E8%AF%95%E7%AA%81%E5%87%BB%E7%8F%AD1_Mysql.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>2023金九银十面试突击班1_Mysql</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.98-%E5%85%AB%E8%82%A1/2023%E9%87%91%E4%B9%9D%E9%93%B6%E5%8D%81%E9%9D%A2%E8%AF%95%E7%AA%81%E5%87%BB%E7%8F%AD2_JVM.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>2023金九银十面试突击班2_JVM</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.98-%E5%85%AB%E8%82%A1/2023%E9%87%91%E4%B9%9D%E9%93%B6%E5%8D%81%E9%9D%A2%E8%AF%95%E7%AA%81%E5%87%BB%E7%8F%AD2_Mysql.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>2023金九银十面试突击班2_Mysql</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.98-%E5%85%AB%E8%82%A1/2023%E9%87%91%E4%B9%9D%E9%93%B6%E5%8D%81%E9%9D%A2%E8%AF%95%E7%AA%81%E5%87%BB%E7%8F%AD_JVM.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>2023金九银十面试突击班_JVM</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.98-%E5%85%AB%E8%82%A1/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>常见问题</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.98-%E5%85%AB%E8%82%A1/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E7%AA%81%E5%87%BB%E7%8F%AD-%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>并发编程突击班 基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.98-%E5%85%AB%E8%82%A1/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E7%AA%81%E5%87%BB%E7%8F%AD-%E9%94%81%E7%AF%87.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>并发编程突击班 锁篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.98-%E5%85%AB%E8%82%A1/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E7%AA%81%E5%87%BB%E7%8F%AD-%E9%9B%86%E5%90%88%E7%AF%87.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>并发编程突击班 集合篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.98-%E5%85%AB%E8%82%A1/%E7%BB%8F%E5%85%B8%E6%A1%86%E6%9E%B6%E6%BA%90%E7%A0%81%E9%9D%A2%E8%AF%95%E9%A2%98.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>经典框架源码面试题</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.98-%E5%85%AB%E8%82%A1/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E4%B8%8ENetty%E9%9D%A2%E8%AF%95%E9%A2%981.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>网络协议与Netty面试题1</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.98-%E5%85%AB%E8%82%A1/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E4%B8%8ENetty%E9%9D%A2%E8%AF%95%E9%A2%982.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>网络协议与Netty面试题2</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.98-%E5%85%AB%E8%82%A1/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E4%B8%8ENetty%E9%9D%A2%E8%AF%95%E9%A2%983.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>网络协议与Netty面试题3</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.98-%E5%85%AB%E8%82%A1/%E9%87%91%E4%B9%9D%E9%93%B6%E5%8D%81%E9%9D%A2%E8%AF%95%E7%AA%81%E5%87%BB%E7%8F%AD3.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>金九银十面试突击班3</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.98-%E5%85%AB%E8%82%A1/%E9%A1%B9%E7%9B%AE.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>项目</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>01.99 PlugIns</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.99-PlugIns/MybatisCodeHelper%E7%A6%BB%E7%BA%BF%E6%BF%80%E6%B4%BB%E5%88%86%E6%9E%90.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>MybatisCodeHelper离线激活分析</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.99-PlugIns/ob.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Ob</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>Obsidian插件开发</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.99-PlugIns/obsidian%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/obsidian%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Obsidian插件开发</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.99-PlugIns/obsidian%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>快速入门</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.99-PlugIns/site.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Site</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/01.99-PlugIns/%E5%BC%80%E5%8F%91%E7%9B%B8%E5%85%B3.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>开发相关</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/01-Dev/index.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Index</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-730aa0ad><section class="VPSidebarItem level-0 collapsible collapsed" data-v-730aa0ad data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h2 class="text" data-v-feaad427>02 Person</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-1 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/index.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Index</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>SEO</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/SEO/index.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Index</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>业务学习</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/00-%E7%AE%80%E4%BB%8B.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>00 简介</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/01-%E8%B7%A8%E5%A2%83%E7%94%B5%E5%95%86%E7%8B%AC%E7%AB%8B%E7%AB%99-%E7%AE%80%E4%BB%8B.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>01 跨境电商独立站 简介</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/02-%E8%B7%A8%E5%A2%83%E7%94%B5%E5%95%86%E5%89%8D%E7%BD%AE%E7%9F%A5%E8%AF%86.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>02 跨境电商前置知识</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/03-%E5%A6%82%E4%BD%95%E5%BF%AB%E9%80%9F%E6%8E%A5%E6%89%8B%E9%A1%B9%E7%9B%AE.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>03 如何快速接手项目</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>04 跨境物流进出口业务</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/04-%E8%B7%A8%E5%A2%83%E7%89%A9%E6%B5%81%E8%BF%9B%E5%87%BA%E5%8F%A3%E4%B8%9A%E5%8A%A1/%E5%9F%BA%E7%A1%80%E6%89%AB%E7%9B%B2.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>基础扫盲</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>05 订单履约</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><section class="VPSidebarItem level-3 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h5 class="text" data-v-feaad427>仓配计费</h5><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-4 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/05-%E8%AE%A2%E5%8D%95%E5%B1%A5%E7%BA%A6/%E4%BB%93%E9%85%8D%E8%AE%A1%E8%B4%B9/%E7%BB%84%E7%BD%91%E4%BC%98%E5%85%88%E7%BA%A7.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>组网优先级</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>07 归因系统</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/07-%E5%BD%92%E5%9B%A0%E7%B3%BB%E7%BB%9F/%E7%AE%80%E4%BB%8B.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>简介</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>08 营销系统</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/08-%E8%90%A5%E9%94%80%E7%B3%BB%E7%BB%9F/00-%E8%90%A5%E9%94%80%E7%B3%BB%E7%BB%9F%E7%AE%80%E4%BB%8B.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>00 营销系统简介</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/08-%E8%90%A5%E9%94%80%E7%B3%BB%E7%BB%9F/01-%E8%90%A5%E9%94%80%E4%B8%9A%E5%8A%A1%E7%9B%B8%E5%85%B3%E9%97%AE%E9%A2%98.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>01 营销业务相关问题</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/08-%E8%90%A5%E9%94%80%E7%B3%BB%E7%BB%9F/02-%E4%BB%B7%E6%A0%BC%E4%BD%93%E7%B3%BB.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>02 价格体系</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>10 搜索系统</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/10-%E6%90%9C%E7%B4%A2%E7%B3%BB%E7%BB%9F/00-%E7%AE%80%E4%BB%8B.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>00 简介</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/10-%E6%90%9C%E7%B4%A2%E7%B3%BB%E7%BB%9F/02.%E6%90%9C%E5%B9%BF%E6%8E%A8%E6%A0%B8%E5%BF%83%E4%B8%9A%E5%8A%A1%E9%93%BE%E8%B7%AF.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>02.搜广推核心业务链路</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>11 推荐系统</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><section class="VPSidebarItem level-3 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h5 class="text" data-v-feaad427>00 《推荐系统从入门到放弃》</h5><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-4 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/11-%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F/00-%E3%80%8A%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E6%94%BE%E5%BC%83%E3%80%8B/01-%E6%A6%82%E8%BF%B0.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>01 概述</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-4 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/11-%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F/00-%E3%80%8A%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E6%94%BE%E5%BC%83%E3%80%8B/02-%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>02 架构设计</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-3 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h5 class="text" data-v-feaad427>00 相关书籍</h5><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><section class="VPSidebarItem level-4 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h6 class="text" data-v-feaad427>《推荐系统技术评估及高效算法》</h6><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-5 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/11-%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F/00-%E7%9B%B8%E5%85%B3%E4%B9%A6%E7%B1%8D/%E3%80%8A%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E6%8A%80%E6%9C%AF%E8%AF%84%E4%BC%B0%E5%8F%8A%E9%AB%98%E6%95%88%E7%AE%97%E6%B3%95%E3%80%8B/01-%E6%A6%82%E8%BF%B0.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>01 概述</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/11-%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F/10-%E4%B9%B0%E4%BA%86%E5%8F%88%E4%B9%B0%E9%A1%B5%E9%80%BB%E8%BE%91.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>10 买了又买页逻辑</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/11-%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%BA%90.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>学习资源</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>12 广告系统</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/12-%E5%B9%BF%E5%91%8A%E7%B3%BB%E7%BB%9F/00-%E5%B9%BF%E5%91%8A%E5%89%8D%E7%BD%AE%E4%B8%9A%E5%8A%A1%E7%9F%A5%E8%AF%86.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>00 广告前置业务知识</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>13 网红联盟营销</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/13-%E7%BD%91%E7%BA%A2%E8%81%94%E7%9B%9F%E8%90%A5%E9%94%80/00-%E7%AE%80%E4%BB%8B.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>00 简介</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E4%B8%9A%E5%8A%A1%E5%AD%A6%E4%B9%A0/13-%E7%BD%91%E7%BA%A2%E8%81%94%E7%9B%9F%E8%90%A5%E9%94%80/01-%E7%BD%91%E7%BA%A2%E5%92%8C%E8%81%94%E7%9B%9F%E4%B9%8B%E9%97%B4%E7%9A%84%E5%85%B3%E7%B3%BB.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>01 网红和联盟之间的关系</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>博客搭建</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/github%E4%B8%8Egitee%E7%9A%84%E5%90%8C%E6%AD%A5%E6%96%B9%E6%A1%88.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Github与gitee的同步方案</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/index.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Index</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/Obs+VitePress+GithubAction%E5%AE%9E%E7%8E%B0%E5%90%8C%E6%AD%A5.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Obs+VitePress+GithubAction实现同步</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/Rss%E5%A4%84%E7%90%86.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Rss处理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/vitepress%20%E5%8A%A8%E6%80%81%E7%9B%AE%E5%BD%95.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Vitepress 动态目录</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/VitePress.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>VitePress</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/%E9%9C%80%E6%B1%82.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>需求</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>博文成长</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>Guide</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><section class="VPSidebarItem level-3 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h5 class="text" data-v-feaad427>程序人生</h5><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-4 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E5%8D%9A%E6%96%87%E6%88%90%E9%95%BF/Guide/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/%E5%BC%80%E5%8F%91%E5%90%8C%E5%AD%A6%E9%A1%BB%E7%9F%A5.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>开发同学须知</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E5%8D%9A%E6%96%87%E6%88%90%E9%95%BF/index.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Index</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>个人提升</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E5%8D%9A%E6%96%87%E6%88%90%E9%95%BF/%E4%B8%AA%E4%BA%BA%E6%8F%90%E5%8D%87/%E6%8E%8C%E6%8F%A1%E4%B9%A0%E6%83%AF.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>掌握习惯</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-2 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h4 class="text" data-v-feaad427>井底之蛙</h4><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E5%8D%9A%E6%96%87%E6%88%90%E9%95%BF/%E4%BA%95%E5%BA%95%E4%B9%8B%E8%9B%99/%E4%B8%9A%E5%8A%A1%E6%A8%A1%E5%BC%8F.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>业务模式</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-3 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E5%8D%9A%E6%96%87%E6%88%90%E9%95%BF/%E4%BA%95%E5%BA%95%E4%B9%8B%E8%9B%99/%E6%8F%90%E5%89%8D%E5%81%9A%E7%9A%84%E6%80%9D%E6%83%B3%E5%87%86%E5%A4%87.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>提前做的思想准备</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>独立开发者</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E7%8B%AC%E7%AB%8B%E5%BC%80%E5%8F%91%E8%80%85/index.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Index</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E7%8B%AC%E7%AB%8B%E5%BC%80%E5%8F%91%E8%80%85/%E6%88%91%E6%98%AF%E8%B0%81.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>我是谁</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E7%8B%AC%E7%AB%8B%E5%BC%80%E5%8F%91%E8%80%85/%E7%8B%AC%E7%AB%8B%E5%BC%80%E5%8F%91%E5%A4%9A%E4%BA%BA%EF%BC%88%E8%BF%9C%E7%A8%8B%EF%BC%89%E5%8D%8F%E4%BD%9C%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>独立开发多人（远程）协作经验分享</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E7%8B%AC%E7%AB%8B%E5%BC%80%E5%8F%91%E8%80%85/%E7%8B%AC%E7%AB%8B%E5%BC%80%E5%8F%91%E8%80%85%E7%9A%84%E6%80%9D%E8%80%83.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>独立开发者的思考</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E7%8B%AC%E7%AB%8B%E5%BC%80%E5%8F%91%E8%80%85/%E8%B5%84%E6%BA%90%E7%AB%99%E7%82%B9.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>资源站点</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E7%AC%94%E8%AE%B0%E6%95%B4%E7%90%86.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>笔记整理</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-1 collapsible collapsed" data-v-feaad427 data-v-feaad427><div class="item" role="button" tabindex="0" data-v-feaad427><div class="indicator" data-v-feaad427></div><h3 class="text" data-v-feaad427>问题思考</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-feaad427><span class="vpi-chevron-right caret-icon" data-v-feaad427></span></div></div><div class="items" data-v-feaad427><!--[--><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E9%97%AE%E9%A2%98%E6%80%9D%E8%80%83/Obsidian%E7%AC%94%E8%AE%B0%E4%B8%AD%E7%9A%84%E6%A0%87%E7%AD%BE%E8%87%AA%E9%97%AD%E5%90%88%E9%97%AE%E9%A2%98.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>Obsidian笔记中的标签自闭合问题</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E9%97%AE%E9%A2%98%E6%80%9D%E8%80%83/%E5%8D%9A%E5%AE%A2%E5%90%8C%E6%AD%A5%E9%97%AE%E9%A2%98.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>博客同步问题</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-feaad427 data-v-feaad427><div class="item" data-v-feaad427><div class="indicator" data-v-feaad427></div><a class="VPLink link link" href="/02-Person/%E9%97%AE%E9%A2%98%E6%80%9D%E8%80%83/%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E6%B3%A8%E5%85%A5%E4%B8%BAnull.html" data-v-feaad427><!--[--><p class="text" data-v-feaad427>定时任务注入为null</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-8bc02b95 data-v-c28d6088><div class="VPDoc has-sidebar has-aside" data-v-c28d6088 data-v-767d2a17><!--[--><!--]--><div class="container" data-v-767d2a17><div class="aside" data-v-767d2a17><div class="aside-curtain" data-v-767d2a17></div><div class="aside-container" data-v-767d2a17><div class="aside-content" data-v-767d2a17><div class="VPDocAside" data-v-767d2a17 data-v-b81430ef><!--[--><!--]--><!--[--><!--]--><div class="VPDocAsideOutline" role="navigation" data-v-b81430ef data-v-346e0d9b><div class="content" data-v-346e0d9b><div class="outline-marker" data-v-346e0d9b></div><div class="outline-title" role="heading" aria-level="2" data-v-346e0d9b>目录</div><nav aria-labelledby="doc-outline-aria-label" data-v-346e0d9b><span class="visually-hidden" id="doc-outline-aria-label" data-v-346e0d9b> Table of Contents for current page </span><ul class="VPDocOutlineItem root" data-v-346e0d9b data-v-4dcdae39><!--[--><!--]--></ul></nav></div></div><!--[--><!--]--><div class="spacer" data-v-b81430ef></div><!--[--><!--]--><div class="VPDocAsideCarbonAds" data-v-b81430ef><div class="VPCarbonAds" data-v-b33901c9></div></div><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-767d2a17><div class="content-container" data-v-767d2a17><!--[--><!--]--><main class="main" data-v-767d2a17><div style="position:relative;" class="vp-doc _01-Dev_01_01-Java_JUC_01-%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B_%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-02" data-v-767d2a17><div><h1 id="线程池" tabindex="-1">线程池 <a class="header-anchor" href="#线程池" aria-label="Permalink to &quot;线程池&quot;">​</a></h1><h2 id="一、什么是线程池" tabindex="-1"><strong>一、什么是线程池</strong> <a class="header-anchor" href="#一、什么是线程池" aria-label="Permalink to &quot;**一、什么是线程池**&quot;">​</a></h2><p>为什么要使用线程池</p><p>在开发中，为了提升效率的操作，我们需要将一些业务采用多线程的方式去执行。</p><p>比如有一个比较大的任务，可以将任务分成几块，分别交给几个线程去执行，最终做一个汇总就可以了。</p><p>比如做业务操作时，需要发送短信或者是发送邮件，这种操作也可以基于异步的方式完成，这种异步的方式，其实就是再构建一个线程去执行。</p><p>但是，如果每次异步操作或者多线程操作都需要新创建一个线程，使用完毕后，线程再被销毁，这样的话，对系统造成一些额外的开销。在处理过程中到底由多线程处理了多少个任务，以及每个线程的开销无法统计和管理。</p><p>所以咱们需要一个线程池机制来管理这些内容。线程池的概念和连接池类似，都是在一个Java的集合中存储大量的线程对象，每次需要执行异步操作或者多线程操作时，不需要重新创建线程，直接从集合中拿到线程对象直接执行方法就可以了。</p><p>JDK中就提供了线程池的类。</p><p>在线程池构建初期，可以将任务提交到线程池中。会根据一定的机制来异步执行这个任务。</p><ul><li><p>可能任务直接被执行</p></li><li><p>任务可以暂时被存储起来了。等到有空闲线程再来处理。</p></li><li><p>任务也可能被拒绝，无法被执行。</p></li></ul><p>JDK提供的线程池中记录了每个线程处理了多少个任务，以及整个线程池处理了多少个任务。同时还可以针对任务执行前后做一些勾子函数（类似于AOP）的实现。可以在任务执行前后做一些日志信息，这样可以多记录信息方便后面统计线程池执行任务时的一些内容参数等等……</p><h2 id="二、jdk自带的构建线程池的方式" tabindex="-1">二、<strong>JDK自带的构建线程池的方式</strong> <a class="header-anchor" href="#二、jdk自带的构建线程池的方式" aria-label="Permalink to &quot;二、**JDK自带的构建线程池的方式**&quot;">​</a></h2><p>JDK中基于Executors提供了很多种线程池</p><h3 id="_2-1-newfixedthreadpool" tabindex="-1">2.1 newFixedThreadPool <a class="header-anchor" href="#_2-1-newfixedthreadpool" aria-label="Permalink to &quot;2.1 newFixedThreadPool&quot;">​</a></h3><p>这个线程池的特别是线程数是固定的。</p><p>在Executors中第一个方法就是构建newFixedThreadPool</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>public static ExecutorService newFixedThreadPool(int nThreads) {</span></span>
<span class="line"><span>    return new ThreadPoolExecutor(nThreads, nThreads,</span></span>
<span class="line"><span>            0L, TimeUnit.MILLISECONDS,</span></span>
<span class="line"><span>            new LinkedBlockingQueue&lt;Runnable&gt;());</span></span>
<span class="line"><span>}</span></span></code></pre></div><p>构建时，需要给newFixedThreadPool方法提供一个nThreads的属性，而这个属性其实就是当前线程池中线程的个数。当前线程池的本质其实就是使用ThreadPoolExecutor。</p><p>构建好当前线程池后，线程个数已经固定好**（线程是懒加载，在构建之初，线程并没有构建出来，而是随着人任务的提交才会将线程在线程池中国构建出来）**。如果线程没构建，线程会待着任务执行被创建和执行。如果线程都已经构建好了，此时任务会被放到LinkedBlockingQueue无界队列中存放，等待线程从LinkedBlockingQueue中去take出任务，然后执行。</p><p>测试功能效果</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>public static void main(String[] args) throws Exception {</span></span>
<span class="line"><span>    ExecutorService threadPool = Executors.newFixedThreadPool(3);</span></span>
<span class="line"><span>    threadPool.execute(() -&gt; {</span></span>
<span class="line"><span>        System.out.println(&quot;1号任务：&quot; + Thread.currentThread().getName() + System.currentTimeMillis());</span></span>
<span class="line"><span>        try {</span></span>
<span class="line"><span>            Thread.sleep(5000);</span></span>
<span class="line"><span>        } catch (InterruptedException e) {</span></span>
<span class="line"><span>            e.printStackTrace();</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>    });</span></span>
<span class="line"><span>    threadPool.execute(() -&gt; {</span></span>
<span class="line"><span>        System.out.println(&quot;2号任务：&quot; + Thread.currentThread().getName() + System.currentTimeMillis());</span></span>
<span class="line"><span>        try {</span></span>
<span class="line"><span>            Thread.sleep(5000);</span></span>
<span class="line"><span>        } catch (InterruptedException e) {</span></span>
<span class="line"><span>            e.printStackTrace();</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>    });</span></span>
<span class="line"><span>    threadPool.execute(() -&gt; {</span></span>
<span class="line"><span>        System.out.println(&quot;3号任务：&quot; + Thread.currentThread().getName() + System.currentTimeMillis());</span></span>
<span class="line"><span>        try {</span></span>
<span class="line"><span>            Thread.sleep(5000);</span></span>
<span class="line"><span>        } catch (InterruptedException e) {</span></span>
<span class="line"><span>            e.printStackTrace();</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>    });</span></span>
<span class="line"><span>}</span></span></code></pre></div><h3 id="_2-2-newsinglethreadexecutor" tabindex="-1">2.2 newSingleThreadExecutor <a class="header-anchor" href="#_2-2-newsinglethreadexecutor" aria-label="Permalink to &quot;2.2 newSingleThreadExecutor&quot;">​</a></h3><p>这个线程池看名字就知道是单例线程池，线程池中只有一个工作线程在处理任务</p><p>如果业务涉及到顺序消费，可以采用newSingleThreadExecutor</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>// 当前这里就是构建单例线程池的方式</span></span>
<span class="line"><span>public static ExecutorService newSingleThreadExecutor() {</span></span>
<span class="line"><span>    return new FinalizableDelegatedExecutorService</span></span>
<span class="line"><span>        // 在内部依然是构建了ThreadPoolExecutor，设置的线程个数为1</span></span>
<span class="line"><span>        // 当任务投递过来后，第一个任务会被工作线程处理，后续的任务会被扔到阻塞队列中</span></span>
<span class="line"><span>        // 投递到阻塞队列中任务的顺序，就是工作线程处理的顺序</span></span>
<span class="line"><span>        // 当前这种线程池可以用作顺序处理的一些业务中</span></span>
<span class="line"><span>        (new ThreadPoolExecutor(1, 1,</span></span>
<span class="line"><span>                                0L, TimeUnit.MILLISECONDS,</span></span>
<span class="line"><span>                                new LinkedBlockingQueue&lt;Runnable&gt;()));</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span></span></span>
<span class="line"><span>static class FinalizableDelegatedExecutorService extends DelegatedExecutorService {</span></span>
<span class="line"><span>    // 线程池的使用没有区别，跟正常的ThreadPoolExecutor没区别</span></span>
<span class="line"><span>    FinalizableDelegatedExecutorService(ExecutorService executor) {</span></span>
<span class="line"><span>        super(executor);</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    // finalize是当前对象被GC干掉之前要执行的方法</span></span>
<span class="line"><span>    // 当前FinalizableDelegatedExecutorService的目的是为了在当前线程池被GC回收之前</span></span>
<span class="line"><span>    // 可以执行shutdown，shutdown方法是将当前线程池停止，并且干掉工作线程</span></span>
<span class="line"><span>    // 但是不能基于这种方式保证线程池一定会执行shutdown</span></span>
<span class="line"><span>    // finalize在执行时，是守护线程，这种线程无法保证一定可以执行完毕。</span></span>
<span class="line"><span>    // 在使用线程池时，如果线程池是基于一个业务构建的，在使用完毕之后，一定要手动执行shutdown，</span></span>
<span class="line"><span>    // 否则会造成JVM中一堆线程</span></span>
<span class="line"><span>    protected void finalize() {</span></span>
<span class="line"><span>        super.shutdown();</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre></div><p>测试单例线程池效果：</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>public static void main(String[] args) throws Exception {</span></span>
<span class="line"><span>    ExecutorService threadPool = Executors.newSingleThreadExecutor();</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    threadPool.execute(() -&gt; {</span></span>
<span class="line"><span>        System.out.println(Thread.currentThread().getName() + &quot;,&quot; + &quot;111&quot;);</span></span>
<span class="line"><span>    });</span></span>
<span class="line"><span>    threadPool.execute(() -&gt; {</span></span>
<span class="line"><span>        System.out.println(Thread.currentThread().getName() + &quot;,&quot; + &quot;222&quot;);</span></span>
<span class="line"><span>    });</span></span>
<span class="line"><span>    threadPool.execute(() -&gt; {</span></span>
<span class="line"><span>        System.out.println(Thread.currentThread().getName() + &quot;,&quot; + &quot;333&quot;);</span></span>
<span class="line"><span>    });</span></span>
<span class="line"><span>    threadPool.execute(() -&gt; {</span></span>
<span class="line"><span>        System.out.println(Thread.currentThread().getName() + &quot;,&quot; + &quot;444&quot;);</span></span>
<span class="line"><span>    });</span></span>
<span class="line"><span>}</span></span></code></pre></div><p>测试线程池使用完毕后，不执行shutdown的后果：</p><p>如果是局部变量仅限当前线程池使用的线程池，在使用完毕之后要记得执行shutdown，避免线程无法结束</p><p><img src="https://fynotefile.oss-cn-zhangjiakou.aliyuncs.com/fynote/fyfile/2746/1661937858024/e2c585e0a27945889b943c8954d84e54.png" alt="" loading="lazy"></p><p><img src="https://fynotefile.oss-cn-zhangjiakou.aliyuncs.com/fynote/fyfile/2746/1661937858024/66fba14d8eba48008ba2f688d0a47507.png" alt="" loading="lazy"></p><p>如果是全局的线程池，很多业务都会到，使用完毕后不要shutdown，因为其他业务也要执行当前线程池</p><p><img src="https://fynotefile.oss-cn-zhangjiakou.aliyuncs.com/fynote/fyfile/2746/1661937858024/d94e335c71684a2cba4aa69cc104367f.png" alt="" loading="lazy"></p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>static ExecutorService threadPool = Executors.newFixedThreadPool(200);</span></span>
<span class="line"><span></span></span>
<span class="line"><span>public static void main(String[] args) throws Exception {</span></span>
<span class="line"><span>    newThreadPool();</span></span>
<span class="line"><span>    System.gc();</span></span>
<span class="line"><span>    Thread.sleep(5000);</span></span>
<span class="line"><span>    System.out.println(&quot;线程池被回收了！！&quot;);</span></span>
<span class="line"><span>    System.in.read();</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span></span></span>
<span class="line"><span>private static void newThreadPool(){</span></span>
<span class="line"><span>    for (int i = 0; i &lt; 200; i++) {</span></span>
<span class="line"><span>        final int a = i;</span></span>
<span class="line"><span>        threadPool.execute(() -&gt; {</span></span>
<span class="line"><span>            System.out.println(a);</span></span>
<span class="line"><span>        });</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    threadPool.shutdown();</span></span>
<span class="line"><span>    for (int i = 0; i &lt; 200; i++) {</span></span>
<span class="line"><span>        final int a = i;</span></span>
<span class="line"><span>        threadPool.execute(() -&gt; {</span></span>
<span class="line"><span>            System.out.println(a);</span></span>
<span class="line"><span>        });</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre></div><h3 id="_2-3-newcachedthreadpool" tabindex="-1">2.3 newCachedThreadPool <a class="header-anchor" href="#_2-3-newcachedthreadpool" aria-label="Permalink to &quot;2.3 newCachedThreadPool&quot;">​</a></h3><p>看名字好像是一个缓存的线程池，查看一下构建的方式</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>public static ExecutorService newCachedThreadPool() {</span></span>
<span class="line"><span>    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,</span></span>
<span class="line"><span>                                  60L, TimeUnit.SECONDS,</span></span>
<span class="line"><span>                                  new SynchronousQueue&lt;Runnable&gt;());</span></span>
<span class="line"><span>}</span></span></code></pre></div><p>当第一次提交任务到线程池时，会直接构建一个工作线程</p><p>这个工作线程带执行完人后，60秒没有任务可以执行后，会结束</p><p>如果在等待60秒期间有任务进来，他会再次拿到这个任务去执行</p><p>如果后续提升任务时，没有线程是空闲的，那么就构建工作线程去执行。</p><p>最大的一个特点，<strong>任务只要提交到当前的newCachedThreadPool中，就必然有工作线程可以处理</strong></p><p>代码测试效果</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>public static void main(String[] args) throws Exception {</span></span>
<span class="line"><span>    ExecutorService executorService = Executors.newCachedThreadPool();</span></span>
<span class="line"><span>    for (int i = 1; i &lt;= 200; i++) {</span></span>
<span class="line"><span>        final int j = i;</span></span>
<span class="line"><span>        executorService.execute(() -&gt; {</span></span>
<span class="line"><span>            try {</span></span>
<span class="line"><span>                Thread.sleep(1000);</span></span>
<span class="line"><span>            } catch (InterruptedException e) {</span></span>
<span class="line"><span>                e.printStackTrace();</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span>            System.out.println(Thread.currentThread().getName() + &quot;:&quot; + j);</span></span>
<span class="line"><span>        });</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre></div><h3 id="_2-4-newschedulethreadpool" tabindex="-1">2.4 newScheduleThreadPool <a class="header-anchor" href="#_2-4-newschedulethreadpool" aria-label="Permalink to &quot;2.4 newScheduleThreadPool&quot;">​</a></h3><p>首先看到名字就可以猜到当前线程池是一个定时任务的线程池，而这个线程池就是可以以一定周期去执行一个任务，或者是延迟多久执行一个任务一次</p><p>查看一下如何构建的。</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {</span></span>
<span class="line"><span>    return new ScheduledThreadPoolExecutor(corePoolSize);</span></span>
<span class="line"><span>}</span></span></code></pre></div><p>基于这个方法可以看到，构建的是ScheduledThreadPoolExecutor线程池</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor{</span></span>
<span class="line"><span>	//....</span></span>
<span class="line"><span>}</span></span></code></pre></div><p>所以本质上还是正常线程池，只不过在原来的线程池基础上实现了定时任务的功能</p><p>原理是基于DelayQueue实现的延迟执行。周期性执行是任务执行完毕后，再次扔回到阻塞队列。</p><p>代码查看使用的方式和效果</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>public static void main(String[] args) throws Exception {</span></span>
<span class="line"><span>    ScheduledExecutorService pool = Executors.newScheduledThreadPool(10);</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    // 正常执行</span></span>
<span class="line"><span>//        pool.execute(() -&gt; {</span></span>
<span class="line"><span>//            System.out.println(Thread.currentThread().getName() + &quot;：1&quot;);</span></span>
<span class="line"><span>//        });</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    // 延迟执行，执行当前任务延迟5s后再执行</span></span>
<span class="line"><span>//        pool.schedule(() -&gt; {</span></span>
<span class="line"><span>//            System.out.println(Thread.currentThread().getName() + &quot;：2&quot;);</span></span>
<span class="line"><span>//        },5,TimeUnit.SECONDS);</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    // 周期执行，当前任务第一次延迟5s执行，然后没3s执行一次</span></span>
<span class="line"><span>    // 这个方法在计算下次执行时间时，是从任务刚刚开始时就计算。</span></span>
<span class="line"><span>//        pool.scheduleAtFixedRate(() -&gt; {</span></span>
<span class="line"><span>//            try {</span></span>
<span class="line"><span>//                Thread.sleep(3000);</span></span>
<span class="line"><span>//            } catch (InterruptedException e) {</span></span>
<span class="line"><span>//                e.printStackTrace();</span></span>
<span class="line"><span>//            }</span></span>
<span class="line"><span>//            System.out.println(System.currentTimeMillis() + &quot;：3&quot;);</span></span>
<span class="line"><span>//        },2,1,TimeUnit.SECONDS);</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    // 周期执行，当前任务第一次延迟5s执行，然后没3s执行一次</span></span>
<span class="line"><span>    // 这个方法在计算下次执行时间时，会等待任务结束后，再计算时间</span></span>
<span class="line"><span>    pool.scheduleWithFixedDelay(() -&gt; {</span></span>
<span class="line"><span>        try {</span></span>
<span class="line"><span>            Thread.sleep(3000);</span></span>
<span class="line"><span>        } catch (InterruptedException e) {</span></span>
<span class="line"><span>            e.printStackTrace();</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>        System.out.println(System.currentTimeMillis() + &quot;：3&quot;);</span></span>
<span class="line"><span>    },2,1,TimeUnit.SECONDS);</span></span>
<span class="line"><span>}</span></span></code></pre></div><p>至于Executors提供的newSingleThreadScheduledExecutor单例的定时任务线程池就不说了。</p><p>一个线程的线程池可以延迟或者以一定的周期执行一个任务。</p><h3 id="_2-5-newworkstealingpool" tabindex="-1">2.5 newWorkStealingPool <a class="header-anchor" href="#_2-5-newworkstealingpool" aria-label="Permalink to &quot;2.5 newWorkStealingPool&quot;">​</a></h3><p>当前JDK提供构建线程池的方式newWorkStealingPool和之前的线程池很非常大的区别</p><p>之前定长，单例，缓存，定时任务都基于ThreadPoolExecutor去实现的。</p><p>newWorkStealingPool是基于ForkJoinPool构建出来的</p><p><strong>ThreadPoolExecutor的核心点</strong>：</p><p>在ThreadPoolExecutor中只有一个阻塞队列存放当前任务</p><p><img src="https://fynotefile.oss-cn-zhangjiakou.aliyuncs.com/fynote/fyfile/2746/1661937858024/90707080cdaa42da91564df1b5aef45a.png" alt="" loading="lazy"><br> ForkJoinPool的核心特点：</p><p>ForkJoinPool从名字上就能看出一些东西。当有一个特别大的任务时，如果采用上述方式，这个大任务只能会某一个线程去执行。ForkJoin第一个特点是可以将一个大任务拆分成多个小任务，放到当前线程的阻塞队列中。其他的空闲线程就可以去处理有任务的线程的阻塞队列中的任务</p><p><img src="https://fynotefile.oss-cn-zhangjiakou.aliyuncs.com/fynote/fyfile/2746/1661937858024/b8dea88b3afd427583c789a9c76fa7fa.png" alt="" loading="lazy"></p><p>来一个比较大的数组，里面存满值，计算总和</p><p>单线程处理一个任务：</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>/** 非常大的数组 */</span></span>
<span class="line"><span>static int[] nums = new int[1_000_000_000];</span></span>
<span class="line"><span>// 填充值</span></span>
<span class="line"><span>static{</span></span>
<span class="line"><span>    for (int i = 0; i &lt; nums.length; i++) {</span></span>
<span class="line"><span>        nums[i] = (int) ((Math.random()) * 1000);</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span>public static void main(String[] args) {</span></span>
<span class="line"><span>    // ===================单线程累加10亿数据================================</span></span>
<span class="line"><span>    System.out.println(&quot;单线程计算数组总和！&quot;);</span></span>
<span class="line"><span>    long start = System.nanoTime();</span></span>
<span class="line"><span>    int sum = 0;</span></span>
<span class="line"><span>    for (int num : nums) {</span></span>
<span class="line"><span>        sum += num;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    long end = System.nanoTime();</span></span>
<span class="line"><span>    System.out.println(&quot;单线程运算结果为：&quot; + sum + &quot;，计算时间为：&quot; + (end  - start));</span></span>
<span class="line"><span>}</span></span></code></pre></div><p>多线程分而治之的方式处理：</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>/** 非常大的数组 */</span></span>
<span class="line"><span>static int[] nums = new int[1_000_000_000];</span></span>
<span class="line"><span>// 填充值</span></span>
<span class="line"><span>static{</span></span>
<span class="line"><span>    for (int i = 0; i &lt; nums.length; i++) {</span></span>
<span class="line"><span>        nums[i] = (int) ((Math.random()) * 1000);</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span>public static void main(String[] args) {</span></span>
<span class="line"><span>    // ===================单线程累加10亿数据================================</span></span>
<span class="line"><span>    System.out.println(&quot;单线程计算数组总和！&quot;);</span></span>
<span class="line"><span>    long start = System.nanoTime();</span></span>
<span class="line"><span>    int sum = 0;</span></span>
<span class="line"><span>    for (int num : nums) {</span></span>
<span class="line"><span>        sum += num;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    long end = System.nanoTime();</span></span>
<span class="line"><span>    System.out.println(&quot;单线程运算结果为：&quot; + sum + &quot;，计算时间为：&quot; + (end  - start));</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    // ===================多线程分而治之累加10亿数据================================</span></span>
<span class="line"><span>    // 在使用forkJoinPool时，不推荐使用Runnable和Callable</span></span>
<span class="line"><span>    // 可以使用提供的另外两种任务的描述方式</span></span>
<span class="line"><span>    // Runnable(没有返回结果) -&gt;   RecursiveAction</span></span>
<span class="line"><span>    // Callable(有返回结果)   -&gt;   RecursiveTask</span></span>
<span class="line"><span>    ForkJoinPool forkJoinPool = (ForkJoinPool) Executors.newWorkStealingPool();</span></span>
<span class="line"><span>    System.out.println(&quot;分而治之计算数组总和！&quot;);</span></span>
<span class="line"><span>    long forkJoinStart = System.nanoTime();</span></span>
<span class="line"><span>    ForkJoinTask&lt;Integer&gt; task = forkJoinPool.submit(new SumRecursiveTask(0, nums.length - 1));</span></span>
<span class="line"><span>    Integer result = task.join();</span></span>
<span class="line"><span>    long forkJoinEnd = System.nanoTime();</span></span>
<span class="line"><span>    System.out.println(&quot;分而治之运算结果为：&quot; + result + &quot;，计算时间为：&quot; + (forkJoinEnd  - forkJoinStart));</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span></span></span>
<span class="line"><span>private static class SumRecursiveTask extends RecursiveTask&lt;Integer&gt;{</span></span>
<span class="line"><span>    /** 指定一个线程处理哪个位置的数据 */</span></span>
<span class="line"><span>    private int start,end;</span></span>
<span class="line"><span>    private final int MAX_STRIDE = 100_000_000;</span></span>
<span class="line"><span>    //  200_000_000： 147964900</span></span>
<span class="line"><span>    //  100_000_000： 145942100</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    public SumRecursiveTask(int start, int end) {</span></span>
<span class="line"><span>        this.start = start;</span></span>
<span class="line"><span>        this.end = end;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    @Override</span></span>
<span class="line"><span>    protected Integer compute() {</span></span>
<span class="line"><span>        // 在这个方法中，需要设置好任务拆分的逻辑以及聚合的逻辑</span></span>
<span class="line"><span>        int sum = 0;</span></span>
<span class="line"><span>        int stride = end - start;</span></span>
<span class="line"><span>        if(stride &lt;= MAX_STRIDE){</span></span>
<span class="line"><span>            // 可以处理任务</span></span>
<span class="line"><span>            for (int i = start; i &lt;= end; i++) {</span></span>
<span class="line"><span>                sum += nums[i];</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span>        }else{</span></span>
<span class="line"><span>            // 将任务拆分，分而治之。</span></span>
<span class="line"><span>            int middle = (start + end) / 2;</span></span>
<span class="line"><span>            // 声明为2个任务</span></span>
<span class="line"><span>            SumRecursiveTask left = new SumRecursiveTask(start, middle);</span></span>
<span class="line"><span>            SumRecursiveTask right = new SumRecursiveTask(middle + 1, end);</span></span>
<span class="line"><span>            // 分别执行两个任务</span></span>
<span class="line"><span>            left.fork();</span></span>
<span class="line"><span>            right.fork();</span></span>
<span class="line"><span>            // 等待结果，并且获取sum</span></span>
<span class="line"><span>            sum = left.join() + right.join();</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>        return sum;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre></div><p>最终可以发现，这种累加的操作中，采用分而治之的方式效率提升了2倍多。</p><p>但是也不是所有任务都能拆分提升效率，首先任务得大，耗时要长。</p><h2 id="三、threadpoolexecutor应用-源码剖析" tabindex="-1">三、<strong>ThreadPoolExecutor应用&amp;源码剖析</strong> <a class="header-anchor" href="#三、threadpoolexecutor应用-源码剖析" aria-label="Permalink to &quot;三、**ThreadPoolExecutor应用&amp;源码剖析**&quot;">​</a></h2><p>前面讲到的Executors中的构建线程池的方式，大多数还是基于ThreadPoolExecutor去new出来的。</p><h3 id="_3-1-为什么要自定义线程池" tabindex="-1">3.1 为什么要自定义线程池 <a class="header-anchor" href="#_3-1-为什么要自定义线程池" aria-label="Permalink to &quot;3.1 为什么要自定义线程池&quot;">​</a></h3><p>首先ThreadPoolExecutor中，一共提供了7个参数，每个参数都是非常核心的属性，在线程池去执行任务时，每个参数都有决定性的作用。</p><p>但是如果直接采用JDK提供的方式去构建，可以设置的核心参数最多就两个，这样就会导致对线程池的控制粒度很粗。所以在阿里规范中也推荐自己去自定义线程池。手动的去new ThreadPoolExecutor设置他的一些核心属性。</p><p>自定义构建线程池，可以细粒度的控制线程池，去管理内存的属性，并且针对一些参数的设置可能更好的在后期排查问题。</p><p>查看一下ThreadPoolExecutor提供的七个核心参数</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>public ThreadPoolExecutor(</span></span>
<span class="line"><span>    int corePoolSize,           // 核心工作线程（当前任务执行结束后，不会被销毁）</span></span>
<span class="line"><span>    int maximumPoolSize,        // 最大工作线程（代表当前线程池中，一共可以有多少个工作线程）</span></span>
<span class="line"><span>    long keepAliveTime,         // 非核心工作线程在阻塞队列位置等待的时间</span></span>
<span class="line"><span>    TimeUnit unit,              // 非核心工作线程在阻塞队列位置等待时间的单位</span></span>
<span class="line"><span>    BlockingQueue&lt;Runnable&gt; workQueue,   // 任务在没有核心工作线程处理时，任务先扔到阻塞队列中</span></span>
<span class="line"><span>    ThreadFactory threadFactory,         // 构建线程的线程工作，可以设置thread的一些信息</span></span>
<span class="line"><span>    RejectedExecutionHandler handler) {  // 当线程池无法处理投递过来的任务时，执行当前的拒绝策略</span></span>
<span class="line"><span>    // 初始化线程池的操作</span></span>
<span class="line"><span>}</span></span></code></pre></div><h3 id="_3-2-threadpoolexecutor应用" tabindex="-1">3.2 ThreadPoolExecutor应用 <a class="header-anchor" href="#_3-2-threadpoolexecutor应用" aria-label="Permalink to &quot;3.2 ThreadPoolExecutor应用&quot;">​</a></h3><p>手动new一下，处理的方式还是执行execute或者submit方法。</p><p>JDK提供的几种拒绝策略：</p><ul><li>AbortPolicy：当前拒绝策略会在无法处理任务时，直接抛出一个异常</li></ul><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {</span></span>
<span class="line"><span>    throw new RejectedExecutionException(&quot;Task &quot; + r.toString() +</span></span>
<span class="line"><span>                                         &quot; rejected from &quot; +</span></span>
<span class="line"><span>                                         e.toString());</span></span>
<span class="line"><span>}</span></span></code></pre></div><ul><li>CallerRunsPolicy：当前拒绝策略会在线程池无法处理任务时，将任务交给调用者处理</li></ul><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {</span></span>
<span class="line"><span>    if (!e.isShutdown()) {</span></span>
<span class="line"><span>        r.run();</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre></div><ul><li>DiscardPolicy：当前拒绝策略会在线程池无法处理任务时，直接将任务丢弃掉</li></ul><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {</span></span>
<span class="line"><span>}</span></span></code></pre></div><ul><li>DiscardOldestPolicy：当前拒绝策略会在线程池无法处理任务时，将队列中最早的任务丢弃掉，将当前任务再次尝试交给线程池处理</li></ul><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {</span></span>
<span class="line"><span>    if (!e.isShutdown()) {</span></span>
<span class="line"><span>        e.getQueue().poll();</span></span>
<span class="line"><span>        e.execute(r);</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre></div><ul><li>自定义Policy：根据自己的业务，可以将任务扔到数据库，也可以做其他操作。</li></ul><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>private static class MyRejectedExecution implements RejectedExecutionHandler{</span></span>
<span class="line"><span>    @Override</span></span>
<span class="line"><span>    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {</span></span>
<span class="line"><span>        System.out.println(&quot;根据自己的业务情况，决定编写的代码！&quot;);</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre></div><p>代码构建线程池，并处理有无返回结果的任务</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>public static void main(String[] args) throws ExecutionException, InterruptedException {</span></span>
<span class="line"><span>    //1. 构建线程池</span></span>
<span class="line"><span>    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(</span></span>
<span class="line"><span>            2,</span></span>
<span class="line"><span>            5,</span></span>
<span class="line"><span>            10,</span></span>
<span class="line"><span>            TimeUnit.SECONDS,</span></span>
<span class="line"><span>            new ArrayBlockingQueue&lt;&gt;(5),</span></span>
<span class="line"><span>            new ThreadFactory() {</span></span>
<span class="line"><span>                @Override</span></span>
<span class="line"><span>                public Thread newThread(Runnable r) {</span></span>
<span class="line"><span>                    Thread thread = new Thread(r);</span></span>
<span class="line"><span>                    thread.setName(&quot;test-ThreadPoolExecutor&quot;);</span></span>
<span class="line"><span>                    return thread;</span></span>
<span class="line"><span>                }</span></span>
<span class="line"><span>            },</span></span>
<span class="line"><span>            new MyRejectedExecution()</span></span>
<span class="line"><span>    );</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    //2. 让线程池处理任务,没返回结果</span></span>
<span class="line"><span>    threadPool.execute(() -&gt; {</span></span>
<span class="line"><span>        System.out.println(&quot;没有返回结果的任务&quot;);</span></span>
<span class="line"><span>    });</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    //3. 让线程池处理有返回结果的任务</span></span>
<span class="line"><span>    Future&lt;Object&gt; future = threadPool.submit(new Callable&lt;Object&gt;() {</span></span>
<span class="line"><span>        @Override</span></span>
<span class="line"><span>        public Object call() throws Exception {</span></span>
<span class="line"><span>            System.out.println(&quot;我有返回结果！&quot;);</span></span>
<span class="line"><span>            return &quot;返回结果&quot;;</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>    });</span></span>
<span class="line"><span>    Object result = future.get();</span></span>
<span class="line"><span>    System.out.println(result);</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    //4. 如果是局部变量的线程池，记得用完要shutdown</span></span>
<span class="line"><span>    threadPool.shutdown();</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span></span></span>
<span class="line"><span></span></span>
<span class="line"><span></span></span>
<span class="line"><span>private static class MyRejectedExecution implements RejectedExecutionHandler{</span></span>
<span class="line"><span>    @Override</span></span>
<span class="line"><span>    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {</span></span>
<span class="line"><span>        System.out.println(&quot;根据自己的业务情况，决定编写的代码！&quot;);</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre></div><h3 id="_3-3-threadpoolexecutor源码剖析" tabindex="-1">3.3 ThreadPoolExecutor源码剖析 <a class="header-anchor" href="#_3-3-threadpoolexecutor源码剖析" aria-label="Permalink to &quot;3.3 ThreadPoolExecutor源码剖析&quot;">​</a></h3><p>线程池的源码内容会比较多一点，需要一点一点的去查看，内部比较多。</p><h4 id="_3-3-1-threadpoolexecutor的核心属性" tabindex="-1">3.3.1 ThreadPoolExecutor的核心属性 <a class="header-anchor" href="#_3-3-1-threadpoolexecutor的核心属性" aria-label="Permalink to &quot;3.3.1 ThreadPoolExecutor的核心属性&quot;">​</a></h4><p>核心属性主要就是ctl，基于ctl拿到线程池的状态以及工作线程个数</p><p>在整个线程池的执行流程中，会基于ctl判断上述两个内容</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>// 当前是线程池的核心属性</span></span>
<span class="line"><span>// 当前的ctl其实就是一个int类型的数值，内部是基于AtomicInteger套了一层，进行运算时，是原子性的。</span></span>
<span class="line"><span>// ctl表示着线程池中的2个核心状态：</span></span>
<span class="line"><span>// 线程池的状态：ctl的高3位，表示线程池状态</span></span>
<span class="line"><span>// 工作线程的数量：ctl的低29位，表示工作线程的个数</span></span>
<span class="line"><span>private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));</span></span>
<span class="line"><span></span></span>
<span class="line"><span>// Integer.SIZE：在获取Integer的bit位个数</span></span>
<span class="line"><span>// 声明了一个常量：COUNT_BITS = 29</span></span>
<span class="line"><span>private static final int COUNT_BITS = Integer.SIZE - 3;</span></span>
<span class="line"><span>00000000 00000000 00000000 00000001</span></span>
<span class="line"><span>00100000 00000000 00000000 00000000</span></span>
<span class="line"><span>00011111 11111111 11111111 11111111</span></span>
<span class="line"><span>// CAPACITY就是当前工作线程能记录的工作线程的最大个数</span></span>
<span class="line"><span>private static final int CAPACITY   = (1 &lt;&lt; COUNT_BITS) - 1;</span></span>
<span class="line"><span></span></span>
<span class="line"><span></span></span>
<span class="line"><span>// 线程池状态的表示</span></span>
<span class="line"><span>// 当前五个状态中，只有RUNNING状态代表线程池没问题，可以正常接收任务处理</span></span>
<span class="line"><span>// 111：代表RUNNING状态，RUNNING可以处理任务，并且处理阻塞队列中的任务。</span></span>
<span class="line"><span>private static final int RUNNING    = -1 &lt;&lt; COUNT_BITS;</span></span>
<span class="line"><span>// 000：代表SHUTDOWN状态，不会接收新任务，正在处理的任务正常进行，阻塞队列的任务也会做完。</span></span>
<span class="line"><span>private static final int SHUTDOWN   =  0 &lt;&lt; COUNT_BITS;</span></span>
<span class="line"><span>// 001：代表STOP状态，不会接收新任务，正在处理任务的线程会被中断，阻塞队列的任务一个不管。</span></span>
<span class="line"><span>private static final int STOP       =  1 &lt;&lt; COUNT_BITS;</span></span>
<span class="line"><span>// 010：代表TIDYING状态，这个状态是否SHUTDOWN或者STOP转换过来的，代表当前线程池马上关闭，就是过渡状态。</span></span>
<span class="line"><span>private static final int TIDYING    =  2 &lt;&lt; COUNT_BITS;</span></span>
<span class="line"><span>// 011：代表TERMINATED状态，这个状态是TIDYING状态转换过来的，转换过来只需要执行一个terminated方法。</span></span>
<span class="line"><span>private static final int TERMINATED =  3 &lt;&lt; COUNT_BITS;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>// 在使用下面这几个方法时，需要传递ctl进来</span></span>
<span class="line"><span></span></span>
<span class="line"><span>// 基于&amp;运算的特点，保证只会拿到ctl高三位的值。</span></span>
<span class="line"><span>private static int runStateOf(int c)     { return c &amp; ~CAPACITY; }</span></span>
<span class="line"><span>// 基于&amp;运算的特点，保证只会拿到ctl低29位的值。</span></span>
<span class="line"><span>private static int workerCountOf(int c)  { return c &amp; CAPACITY; }</span></span></code></pre></div><p>线程池状态的特点以及转换的方式</p><p><img src="https://fynotefile.oss-cn-zhangjiakou.aliyuncs.com/fynote/fyfile/2746/1661937858024/9e8573ec5f5b4f1a9496e5795b773a44.png" alt="" loading="lazy"></p><h4 id="_3-3-2-threadpoolexecutor的有参构造" tabindex="-1">3.3.2 ThreadPoolExecutor的有参构造 <a class="header-anchor" href="#_3-3-2-threadpoolexecutor的有参构造" aria-label="Permalink to &quot;3.3.2 ThreadPoolExecutor的有参构造&quot;">​</a></h4><p>有参构造没啥说的，记住核心线程个数是允许为0的。</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>// 有参构造。无论调用哪个有参构造，最终都会执行当前的有参构造</span></span>
<span class="line"><span>public ThreadPoolExecutor(int corePoolSize,</span></span>
<span class="line"><span>                          int maximumPoolSize,</span></span>
<span class="line"><span>                          long keepAliveTime,</span></span>
<span class="line"><span>                          TimeUnit unit,</span></span>
<span class="line"><span>                          BlockingQueue&lt;Runnable&gt; workQueue,</span></span>
<span class="line"><span>                          ThreadFactory threadFactory,</span></span>
<span class="line"><span>                          RejectedExecutionHandler handler) {</span></span>
<span class="line"><span>    // 健壮性校验</span></span>
<span class="line"><span>    // 核心线程个数是允许为0个的。</span></span>
<span class="line"><span>    // 最大线程数必须大于0，最大线程数要大于等于核心线程数</span></span>
<span class="line"><span>    // 非核心线程的最大空闲时间，可以等于0</span></span>
<span class="line"><span>    if (corePoolSize &lt; 0 ||</span></span>
<span class="line"><span>        maximumPoolSize &lt;= 0 ||</span></span>
<span class="line"><span>        maximumPoolSize &lt; corePoolSize ||</span></span>
<span class="line"><span>        keepAliveTime &lt; 0)</span></span>
<span class="line"><span>        // 不满足要求就抛出参数异常</span></span>
<span class="line"><span>        throw new IllegalArgumentException();</span></span>
<span class="line"><span>    // 阻塞队列，线程工厂，拒绝策略都不允许为null，为null就扔空指针异常</span></span>
<span class="line"><span>    if (workQueue == null || threadFactory == null || handler == null)</span></span>
<span class="line"><span>        throw new NullPointerException();</span></span>
<span class="line"><span>    // 不要关注当前内容，系统资源访问决策，和线程池核心业务关系不大。</span></span>
<span class="line"><span>    this.acc = System.getSecurityManager() == null ? null : AccessController.getContext();</span></span>
<span class="line"><span>    // 各种赋值，JUC包下，几乎所有涉及到线程挂起的操作，单位都用纳秒。</span></span>
<span class="line"><span>    // 有参构造的值，都赋值给成员变量。</span></span>
<span class="line"><span>    // Doug Lea的习惯就是将成员变量作为局部变量单独操作。</span></span>
<span class="line"><span>    this.corePoolSize = corePoolSize;</span></span>
<span class="line"><span>    this.maximumPoolSize = maximumPoolSize;</span></span>
<span class="line"><span>    this.workQueue = workQueue;</span></span>
<span class="line"><span>    this.keepAliveTime = unit.toNanos(keepAliveTime);</span></span>
<span class="line"><span>    this.threadFactory = threadFactory;</span></span>
<span class="line"><span>    this.handler = handler;</span></span>
<span class="line"><span>}</span></span></code></pre></div><h4 id="_3-3-3-threadpoolexecutor的execute方法" tabindex="-1">3.3.3 ThreadPoolExecutor的execute方法 <a class="header-anchor" href="#_3-3-3-threadpoolexecutor的execute方法" aria-label="Permalink to &quot;3.3.3 ThreadPoolExecutor的execute方法&quot;">​</a></h4><p>execute方法是提交任务到线程池的核心方法，很重要</p><p>线程池的执行流程其实就是在说execute方法内部做了哪些判断</p><p>execute源码的分析</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>// 提交任务到线程池的核心方法</span></span>
<span class="line"><span>// command就是提交过来的任务</span></span>
<span class="line"><span>public void execute(Runnable command) {</span></span>
<span class="line"><span>    // 提交的任务不能为null</span></span>
<span class="line"><span>    if (command == null)</span></span>
<span class="line"><span>        throw new NullPointerException();</span></span>
<span class="line"><span>    // 获取核心属性ctl，用于后面的判断</span></span>
<span class="line"><span>    int c = ctl.get();</span></span>
<span class="line"><span>    // 如果工作线程个数，小于核心线程数。</span></span>
<span class="line"><span>    // 满足要求，添加核心工作线程</span></span>
<span class="line"><span>    if (workerCountOf(c) &lt; corePoolSize) {</span></span>
<span class="line"><span>        // addWorker(任务,是核心线程吗)</span></span>
<span class="line"><span>        // addWorker返回true：代表添加工作线程成功</span></span>
<span class="line"><span>        // addWorker返回false：代表添加工作线程失败</span></span>
<span class="line"><span>        // addWorker中会基于线程池状态，以及工作线程个数做判断，查看能否添加工作线程</span></span>
<span class="line"><span>        if (addWorker(command, true))</span></span>
<span class="line"><span>            // 工作线程构建出来了，任务也交给command去处理了。</span></span>
<span class="line"><span>            return;</span></span>
<span class="line"><span>        // 说明线程池状态或者是工作线程个数发生了变化，导致添加失败，重新获取一次ctl</span></span>
<span class="line"><span>        c = ctl.get();</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    // 添加核心工作线程失败，往这走</span></span>
<span class="line"><span>    // 判断线程池状态是否是RUNNING，如果是，正常基于阻塞队列的offer方法，将任务添加到阻塞队列</span></span>
<span class="line"><span>    if (isRunning(c) &amp;&amp; workQueue.offer(command)) {</span></span>
<span class="line"><span>        // 如果任务添加到阻塞队列成功，走if内部</span></span>
<span class="line"><span>        // 如果任务在扔到阻塞队列之前，线程池状态突然改变了。</span></span>
<span class="line"><span>        // 重新获取ctl</span></span>
<span class="line"><span>        int recheck = ctl.get();</span></span>
<span class="line"><span>        // 如果线程池的状态不是RUNNING，将任务从阻塞队列移除，</span></span>
<span class="line"><span>        if (!isRunning(recheck) &amp;&amp; remove(command))</span></span>
<span class="line"><span>            // 并且直接拒绝策略</span></span>
<span class="line"><span>            reject(command);</span></span>
<span class="line"><span>        // 在这，说明阻塞队列有我刚刚放进去的任务</span></span>
<span class="line"><span>        // 查看一下工作线程数是不是0个</span></span>
<span class="line"><span>        // 如果工作线程为0个，需要添加一个非核心工作线程去处理阻塞队列中的任务</span></span>
<span class="line"><span>        // 发生这种情况有两种：</span></span>
<span class="line"><span>        // 1. 构建线程池时，核心线程数是0个。</span></span>
<span class="line"><span>        // 2. 即便有核心线程，可以设置核心线程也允许超时，设置allowCoreThreadTimeOut为true，代表核心线程也可以超时</span></span>
<span class="line"><span>        else if (workerCountOf(recheck) == 0)</span></span>
<span class="line"><span>            // 为了避免阻塞队列中的任务饥饿，添加一个非核心工作线程去处理</span></span>
<span class="line"><span>            addWorker(null, false);</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    // 任务添加到阻塞队列失败</span></span>
<span class="line"><span>    // 构建一个非核心工作线程</span></span>
<span class="line"><span>    // 如果添加非核心工作线程成功，直接完事，告辞</span></span>
<span class="line"><span>    else if (!addWorker(command, false))</span></span>
<span class="line"><span>        // 添加失败，执行决绝策略</span></span>
<span class="line"><span>        reject(command);</span></span>
<span class="line"><span>}</span></span></code></pre></div><p>execute方法的完整执行流程图</p><p><img src="https://fynotefile.oss-cn-zhangjiakou.aliyuncs.com/fynote/fyfile/2746/1661937858024/21bfed2ad43648b490292d59067142ea.png" alt="" loading="lazy"></p><h4 id="_3-3-4-threadpoolexecutor的addworker方法" tabindex="-1">3.3.4 ThreadPoolExecutor的addWorker方法 <a class="header-anchor" href="#_3-3-4-threadpoolexecutor的addworker方法" aria-label="Permalink to &quot;3.3.4 ThreadPoolExecutor的addWorker方法&quot;">​</a></h4><p>addWorker中主要分成两大块去看</p><ul><li><p>第一块：校验线程池的状态以及工作线程个数</p></li><li><p>第二块：添加工作线程并且启动工作线程</p></li></ul><p>校验线程池的状态以及工作线程个数</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>// 添加工作线程之校验源码</span></span>
<span class="line"><span>private boolean addWorker(Runnable firstTask, boolean core) {</span></span>
<span class="line"><span>    // 外层for循环在校验线程池的状态</span></span>
<span class="line"><span>    // 内层for循环是在校验工作线程的个数</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    // retry是给外层for循环添加一个标记，是为了方便在内层for循坏跳出外层for循环</span></span>
<span class="line"><span>    retry:</span></span>
<span class="line"><span>    for (;;) {</span></span>
<span class="line"><span>        // 获取ctl</span></span>
<span class="line"><span>        int c = ctl.get();</span></span>
<span class="line"><span>        // 拿到ctl的高3位的值</span></span>
<span class="line"><span>        int rs = runStateOf(c);</span></span>
<span class="line"><span>//==========================线程池状态判断==================================================</span></span>
<span class="line"><span>        // 如果线程池状态是SHUTDOWN，并且此时阻塞队列有任务，工作线程个数为0，添加一个工作线程去处理阻塞队列的任务</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        // 判断线程池的状态是否大于等于SHUTDOWN，如果满足，说明线程池不是RUNNING</span></span>
<span class="line"><span>        if (rs &gt;= SHUTDOWN &amp;&amp;</span></span>
<span class="line"><span>            // 如果这三个条件都满足，就代表是要添加非核心工作线程去处理阻塞队列任务</span></span>
<span class="line"><span>            // 如果三个条件有一个没满足，返回false，配合!，就代表不需要添加</span></span>
<span class="line"><span>            !(rs == SHUTDOWN &amp;&amp; firstTask == null &amp;&amp; ! workQueue.isEmpty()))</span></span>
<span class="line"><span>            // 不需要添加工作线程</span></span>
<span class="line"><span>            return false;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        for (;;) {</span></span>
<span class="line"><span>//==========================工作线程个数判断================================================== </span></span>
<span class="line"><span>            // 基于ctl拿到低29位的值，代表当前工作线程个数   </span></span>
<span class="line"><span>            int wc = workerCountOf(c);</span></span>
<span class="line"><span>            // 如果工作线程个数大于最大值了，不可以添加了，返回false</span></span>
<span class="line"><span>            if (wc &gt;= CAPACITY ||</span></span>
<span class="line"><span>                // 基于core来判断添加的是否是核心工作线程</span></span>
<span class="line"><span>                // 如果是核心：基于corePoolSize去判断</span></span>
<span class="line"><span>                // 如果是非核心：基于maximumPoolSize去判断</span></span>
<span class="line"><span>                wc &gt;= (core ? corePoolSize : maximumPoolSize))</span></span>
<span class="line"><span>                // 代表不能添加，工作线程个数不满足要求</span></span>
<span class="line"><span>                return false;</span></span>
<span class="line"><span>            // 针对ctl进行 + 1，采用CAS的方式</span></span>
<span class="line"><span>            if (compareAndIncrementWorkerCount(c))</span></span>
<span class="line"><span>                // CAS成功后，直接退出外层循环，代表可以执行添加工作线程操作了。</span></span>
<span class="line"><span>                break retry;</span></span>
<span class="line"><span>            // 重新获取一次ctl的值</span></span>
<span class="line"><span>            c = ctl.get(); </span></span>
<span class="line"><span>            // 判断重新获取到的ctl中，表示的线程池状态跟之前的是否有区别</span></span>
<span class="line"><span>            // 如果状态不一样，说明有变化，重新的去判断线程池状态</span></span>
<span class="line"><span>            if (runStateOf(c) != rs)</span></span>
<span class="line"><span>                // 跳出一次外层for循环</span></span>
<span class="line"><span>                continue retry;</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    // 省略添加工作线程以及启动的过程</span></span>
<span class="line"><span>}</span></span></code></pre></div><p>添加工作线程并且启动工作线程</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>private boolean addWorker(Runnable firstTask, boolean core) {</span></span>
<span class="line"><span>    // 省略校验部分的代码</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    // 添加工作线程以及启动工作线程~~~</span></span>
<span class="line"><span>    // 声明了三个变量</span></span>
<span class="line"><span>    // 工作线程启动了没，默认false</span></span>
<span class="line"><span>    boolean workerStarted = false;</span></span>
<span class="line"><span>    // 工作线程添加了没，默认false</span></span>
<span class="line"><span>    boolean workerAdded = false;</span></span>
<span class="line"><span>    // 工作线程，默认为null</span></span>
<span class="line"><span>    Worker w = null;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    try {</span></span>
<span class="line"><span>        // 构建工作线程，并且将任务传递进去</span></span>
<span class="line"><span>        w = new Worker(firstTask);</span></span>
<span class="line"><span>        // 获取了Worker中的Thread对象</span></span>
<span class="line"><span>        final Thread t = w.thread;</span></span>
<span class="line"><span>        // 判断Thread是否不为null，在new Worker时，内部会通过给予的ThreadFactory去构建Thread交给Worker</span></span>
<span class="line"><span>        // 一般如果为null，代表ThreadFactory有问题。</span></span>
<span class="line"><span>        if (t != null) {</span></span>
<span class="line"><span>            // 加锁，保证使用workers成员变量以及对largestPoolSize赋值时，保证线程安全</span></span>
<span class="line"><span>            final ReentrantLock mainLock = this.mainLock;</span></span>
<span class="line"><span>            mainLock.lock();</span></span>
<span class="line"><span>            try {</span></span>
<span class="line"><span>                // 再次获取线程池状态。</span></span>
<span class="line"><span>                int rs = runStateOf(ctl.get());</span></span>
<span class="line"><span>                // 再次判断</span></span>
<span class="line"><span>                // 如果满足  rs &lt; SHUTDOWN  说明线程池是RUNNING，状态正常，执行if代码块</span></span>
<span class="line"><span>                // 如果线程池状态为SHUTDOWN，并且firstTask为null，添加非核心工作处理阻塞队列任务</span></span>
<span class="line"><span>                if (rs &lt; SHUTDOWN ||</span></span>
<span class="line"><span>                    (rs == SHUTDOWN &amp;&amp; firstTask == null)) {</span></span>
<span class="line"><span>                    // 到这，可以添加工作线程。</span></span>
<span class="line"><span>                    // 校验ThreadFactory构建线程后，不能自己启动线程，如果启动了，抛出异常</span></span>
<span class="line"><span>                    if (t.isAlive()) </span></span>
<span class="line"><span>                        throw new IllegalThreadStateException();</span></span>
<span class="line"><span>                    // private final HashSet&lt;Worker&gt; workers = new HashSet&lt;Worker&gt;();</span></span>
<span class="line"><span>                    // 将new好的Worker添加到HashSet中。</span></span>
<span class="line"><span>                    workers.add(w);</span></span>
<span class="line"><span>                    // 获取了HashSet的size，拿到工作线程个数</span></span>
<span class="line"><span>                    int s = workers.size();</span></span>
<span class="line"><span>                    // largestPoolSize在记录最大线程个数的记录</span></span>
<span class="line"><span>                    // 如果当前工作线程个数，大于最大线程个数的记录，就赋值</span></span>
<span class="line"><span>                    if (s &gt; largestPoolSize)</span></span>
<span class="line"><span>                        largestPoolSize = s;</span></span>
<span class="line"><span>                    // 添加工作线程成功</span></span>
<span class="line"><span>                    workerAdded = true;</span></span>
<span class="line"><span>                }</span></span>
<span class="line"><span>            } finally {</span></span>
<span class="line"><span>                mainLock.unlock();</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span>            // 如果工作线程添加成功，</span></span>
<span class="line"><span>            if (workerAdded) {</span></span>
<span class="line"><span>                // 直接启动Worker中的线程</span></span>
<span class="line"><span>                t.start();</span></span>
<span class="line"><span>                // 启动工作线程成功</span></span>
<span class="line"><span>                workerStarted = true;</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>    } finally {</span></span>
<span class="line"><span>        // 做补偿的操作，如果工作线程启动失败，将这个添加失败的工作线程处理掉</span></span>
<span class="line"><span>        if (!workerStarted)</span></span>
<span class="line"><span>            addWorkerFailed(w);</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    // 返回工作线程是否启动成功</span></span>
<span class="line"><span>    return workerStarted;</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span>// 工作线程启动失败，需要不的步长操作</span></span>
<span class="line"><span>private void addWorkerFailed(Worker w) {</span></span>
<span class="line"><span>    // 因为操作了workers，需要加锁</span></span>
<span class="line"><span>    final ReentrantLock mainLock = this.mainLock;</span></span>
<span class="line"><span>    mainLock.lock();</span></span>
<span class="line"><span>    try {</span></span>
<span class="line"><span>        // 如果w不为null，之前Worker已经new出来了。</span></span>
<span class="line"><span>        if (w != null)</span></span>
<span class="line"><span>            // 从HashSet中移除</span></span>
<span class="line"><span>            workers.remove(w);</span></span>
<span class="line"><span>        // 同时对ctl进行 - 1，代表去掉了一个工作线程个数</span></span>
<span class="line"><span>        decrementWorkerCount();</span></span>
<span class="line"><span>        // 因为工作线程启动失败，判断一下状态的问题，是不是可以走TIDYING状态最终到TERMINATED状态了。</span></span>
<span class="line"><span>        tryTerminate();</span></span>
<span class="line"><span>    } finally {</span></span>
<span class="line"><span>        // 释放锁</span></span>
<span class="line"><span>        mainLock.unlock();</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre></div><h4 id="_3-3-5-threadpoolexecutor的worker工作线程" tabindex="-1">3.3.5 ThreadPoolExecutor的Worker工作线程 <a class="header-anchor" href="#_3-3-5-threadpoolexecutor的worker工作线程" aria-label="Permalink to &quot;3.3.5 ThreadPoolExecutor的Worker工作线程&quot;">​</a></h4><p>Worker对象主要包含了两个内容</p><ul><li><p>工作线程要执行任务</p></li><li><p>工作线程可能会被中断，控制中断</p></li></ul><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>// Worker继承了AQS，目的就是为了控制工作线程的中断。</span></span>
<span class="line"><span>// Worker实现了Runnable，内部的Thread对象，在执行start时，必然要执行Worker中断额一些操作</span></span>
<span class="line"><span>private final class Worker extends AbstractQueuedSynchronizer implements Runnable{</span></span>
<span class="line"><span>  </span></span>
<span class="line"><span>// =======================Worker管理任务================================  </span></span>
<span class="line"><span>    // 线程工厂构建的线程</span></span>
<span class="line"><span>    final Thread thread;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    // 当前Worker要执行的任务</span></span>
<span class="line"><span>    Runnable firstTask;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    // 记录当前工作线程处理了多少个任务。</span></span>
<span class="line"><span>    volatile long completedTasks;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    // 有参构造</span></span>
<span class="line"><span>    Worker(Runnable firstTask) {</span></span>
<span class="line"><span>        // 将State设置为-1，代表当前不允许中断线程</span></span>
<span class="line"><span>        setState(-1); </span></span>
<span class="line"><span>        // 任务赋值</span></span>
<span class="line"><span>        this.firstTask = firstTask;</span></span>
<span class="line"><span>        // 基于线程工作构建Thread，并且传入的Runnable是Worker</span></span>
<span class="line"><span>        this.thread = getThreadFactory().newThread(this);</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    // 当thread执行start方法时，调用的是Worker的run方法，</span></span>
<span class="line"><span>    public void run() {</span></span>
<span class="line"><span>        // 任务执行时，执行的是runWorker方法</span></span>
<span class="line"><span>        runWorker(this);</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span></span></span>
<span class="line"><span>// =======================Worker管理中断================================   </span></span>
<span class="line"><span>    // 当前方法是中断工作线程时，执行的方法</span></span>
<span class="line"><span>    void interruptIfStarted() {</span></span>
<span class="line"><span>        Thread t;</span></span>
<span class="line"><span>        // 只有Worker中的state &gt;= 0的时候，可以中断工作线程</span></span>
<span class="line"><span>        if (getState() &gt;= 0 &amp;&amp; (t = thread) != null &amp;&amp; !t.isInterrupted()) {</span></span>
<span class="line"><span>            try {</span></span>
<span class="line"><span>                // 如果状态正常，并且线程未中断，这边就中断线程</span></span>
<span class="line"><span>                t.interrupt();</span></span>
<span class="line"><span>            } catch (SecurityException ignore) {</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>  </span></span>
<span class="line"><span>    protected boolean isHeldExclusively() {</span></span>
<span class="line"><span>        return getState() != 0;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    protected boolean tryAcquire(int unused) {</span></span>
<span class="line"><span>        if (compareAndSetState(0, 1)) {</span></span>
<span class="line"><span>            setExclusiveOwnerThread(Thread.currentThread());</span></span>
<span class="line"><span>            return true;</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>        return false;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    protected boolean tryRelease(int unused) {</span></span>
<span class="line"><span>        setExclusiveOwnerThread(null);</span></span>
<span class="line"><span>        setState(0);</span></span>
<span class="line"><span>        return true;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    public void lock()        { acquire(1); }</span></span>
<span class="line"><span>    public boolean tryLock()  { return tryAcquire(1); }</span></span>
<span class="line"><span>    public void unlock()      { release(1); }</span></span>
<span class="line"><span>    public boolean isLocked() { return isHeldExclusively(); }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>  </span></span>
<span class="line"><span>}</span></span></code></pre></div><h4 id="_3-3-6-threadpoolexecutor的runworker方法" tabindex="-1">3.3.6 ThreadPoolExecutor的runWorker方法 <a class="header-anchor" href="#_3-3-6-threadpoolexecutor的runworker方法" aria-label="Permalink to &quot;3.3.6 ThreadPoolExecutor的runWorker方法&quot;">​</a></h4><p>runWorker就是让工作线程拿到任务去执行即可。</p><p>并且在内部也处理了在工作线程正常结束和异常结束时的处理方案</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>// 工作线程启动后执行的任务。</span></span>
<span class="line"><span>final void runWorker(Worker w) {</span></span>
<span class="line"><span>    // 拿到当前线程</span></span>
<span class="line"><span>    Thread wt = Thread.currentThread();</span></span>
<span class="line"><span>    // 从worker对象中拿到任务</span></span>
<span class="line"><span>    Runnable task = w.firstTask;</span></span>
<span class="line"><span>    // 将Worker中的firstTask置位空</span></span>
<span class="line"><span>    w.firstTask = null;</span></span>
<span class="line"><span>    // 将Worker中的state置位0，代表当前线程可以中断的</span></span>
<span class="line"><span>    w.unlock(); // allow interrupts</span></span>
<span class="line"><span>    // 判断工作线程是否是异常结束，默认就是异常结束</span></span>
<span class="line"><span>    boolean completedAbruptly = true;</span></span>
<span class="line"><span>    try {</span></span>
<span class="line"><span>        // 获取任务</span></span>
<span class="line"><span>        // 直接拿到第一个任务去执行</span></span>
<span class="line"><span>        // 如果第一个任务为null，去阻塞队列中获取任务</span></span>
<span class="line"><span>        while (task != null || (task = getTask()) != null) {</span></span>
<span class="line"><span>            // 执行了Worker的lock方法，当前在lock时，shutdown操作不能中断当前线程，因为当前线程正在处理任务</span></span>
<span class="line"><span>            w.lock();</span></span>
<span class="line"><span>            // 比较ctl &gt;= STOP,如果满足找个状态，说明线程池已经到了STOP状态甚至已经要凉凉了</span></span>
<span class="line"><span>            // 线程池到STOP状态，并且当前线程还没有中断，确保线程是中断的，进到if内部执行中断方法</span></span>
<span class="line"><span>            // if(runStateAtLeast(ctl.get(), STOP) &amp;&amp; !wt.isInterrupted()) {中断线程}</span></span>
<span class="line"><span>            // 如果线程池状态不是STOP，确保线程不是中断的。</span></span>
<span class="line"><span>            // 如果发现线程中断标记位是true了，再次查看线程池状态是大于STOP了，再次中断线程</span></span>
<span class="line"><span>            // 这里其实就是做了一个事情，如果线程池状态 &gt;= STOP，确保线程中断了。</span></span>
<span class="line"><span>            if (</span></span>
<span class="line"><span>                (</span></span>
<span class="line"><span>                    runStateAtLeast(ctl.get(), STOP) ||  </span></span>
<span class="line"><span>                    (     Thread.interrupted() &amp;&amp; runStateAtLeast(ctl.get(), STOP)   )</span></span>
<span class="line"><span>                )</span></span>
<span class="line"><span>                &amp;&amp; !wt.isInterrupted())</span></span>
<span class="line"><span>                wt.interrupt();</span></span>
<span class="line"><span>            try {</span></span>
<span class="line"><span>                // 勾子函数在线程池中没有做任何的实现，如果需要在线程池执行任务前后做一些额外的处理，可以重写勾子函数</span></span>
<span class="line"><span>                // 前置勾子函数</span></span>
<span class="line"><span>                beforeExecute(wt, task);</span></span>
<span class="line"><span>                Throwable thrown = null;</span></span>
<span class="line"><span>                try {</span></span>
<span class="line"><span>                    // 执行任务。</span></span>
<span class="line"><span>                    task.run();</span></span>
<span class="line"><span>                } catch (RuntimeException x) {</span></span>
<span class="line"><span>                    thrown = x; throw x;</span></span>
<span class="line"><span>                } catch (Error x) {</span></span>
<span class="line"><span>                    thrown = x; throw x;</span></span>
<span class="line"><span>                } catch (Throwable x) {</span></span>
<span class="line"><span>                    thrown = x; throw new Error(x);</span></span>
<span class="line"><span>                } finally {</span></span>
<span class="line"><span>                    // 前后置勾子函数</span></span>
<span class="line"><span>                    afterExecute(task, thrown);</span></span>
<span class="line"><span>                }</span></span>
<span class="line"><span>            } finally {</span></span>
<span class="line"><span>                // 任务执行完，丢掉任务</span></span>
<span class="line"><span>                task = null;</span></span>
<span class="line"><span>                // 当前工作线程处理的任务数+1</span></span>
<span class="line"><span>                w.completedTasks++;</span></span>
<span class="line"><span>                // 执行unlock方法，此时shutdown方法才可以中断当前线程</span></span>
<span class="line"><span>                w.unlock();</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>        // 如果while循环结束，正常走到这，说明是正常结束</span></span>
<span class="line"><span>        // 正常结束的话，在getTask中就会做一个额外的处理，将ctl - 1，代表工作线程没一个。</span></span>
<span class="line"><span>        completedAbruptly = false;</span></span>
<span class="line"><span>    } finally {</span></span>
<span class="line"><span>        // 考虑干掉工作线程</span></span>
<span class="line"><span>        processWorkerExit(w, completedAbruptly);</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span>// 工作线程结束前，要执行当前方法</span></span>
<span class="line"><span>private void processWorkerExit(Worker w, boolean completedAbruptly) {</span></span>
<span class="line"><span>    // 如果是异常结束</span></span>
<span class="line"><span>    if (completedAbruptly) </span></span>
<span class="line"><span>        // 将ctl - 1，扣掉一个工作线程</span></span>
<span class="line"><span>        decrementWorkerCount();</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    // 操作Worker，为了线程安全，加锁</span></span>
<span class="line"><span>    final ReentrantLock mainLock = this.mainLock;</span></span>
<span class="line"><span>    mainLock.lock();</span></span>
<span class="line"><span>    try {</span></span>
<span class="line"><span>        // 当前工作线程处理的任务个数累加到线程池处理任务的个数属性中</span></span>
<span class="line"><span>        completedTaskCount += w.completedTasks;</span></span>
<span class="line"><span>        // 将工作线程从hashSet中移除</span></span>
<span class="line"><span>        workers.remove(w);</span></span>
<span class="line"><span>    } finally {</span></span>
<span class="line"><span>        // 释放锁</span></span>
<span class="line"><span>        mainLock.unlock();</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    // 只要工作线程凉了，查看是不是线程池状态改变了。</span></span>
<span class="line"><span>    tryTerminate();</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    // 获取ctl</span></span>
<span class="line"><span>    int c = ctl.get();</span></span>
<span class="line"><span>    // 判断线程池状态，当前线程池要么是RUNNING，要么是SHUTDOWN</span></span>
<span class="line"><span>    if (runStateLessThan(c, STOP)) {</span></span>
<span class="line"><span>        // 如果正常结束工作线程</span></span>
<span class="line"><span>        if (!completedAbruptly) {</span></span>
<span class="line"><span>            // 如果核心线程允许超时，min = 0，否则就是核心线程个数</span></span>
<span class="line"><span>            int min = allowCoreThreadTimeOut ? 0 : corePoolSize;</span></span>
<span class="line"><span>            // 如果min == 0，可能会出现没有工作线程，并且阻塞队列有任务没有线程处理</span></span>
<span class="line"><span>            if (min == 0 &amp;&amp; ! workQueue.isEmpty())</span></span>
<span class="line"><span>                // 至少要有一个工作线程处理阻塞队列任务</span></span>
<span class="line"><span>                min = 1;</span></span>
<span class="line"><span>            // 如果工作线程个数 大于等于1，不怕没线程处理，正常return</span></span>
<span class="line"><span>            if (workerCountOf(c) &gt;= min)</span></span>
<span class="line"><span>                return; </span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>        // 异常结束，为了避免出现问题，添加一个空任务的非核心线程来填补上刚刚异常结束的工作线程</span></span>
<span class="line"><span>        addWorker(null, false);</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre></div><h4 id="_3-3-7-threadpoolexecutor的gettask方法" tabindex="-1">3.3.7 ThreadPoolExecutor的getTask方法 <a class="header-anchor" href="#_3-3-7-threadpoolexecutor的gettask方法" aria-label="Permalink to &quot;3.3.7 ThreadPoolExecutor的getTask方法&quot;">​</a></h4><p>工作线程在去阻塞队列获取任务前，要先查看线程池状态</p><p>如果状态没问题，去阻塞队列take或者是poll任务</p><p>第二个循环时，不但要判断线程池状态，还要判断当前工作线程是否可以被干掉</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>// 当前方法就在阻塞队列中获取任务</span></span>
<span class="line"><span>// 前面半部分是判断当前工作线程是否可以返回null，结束。</span></span>
<span class="line"><span>// 后半部分就是从阻塞队列中拿任务</span></span>
<span class="line"><span>private Runnable getTask() {</span></span>
<span class="line"><span>    // timeOut默认值是false。</span></span>
<span class="line"><span>    boolean timedOut = false; </span></span>
<span class="line"><span></span></span>
<span class="line"><span>    // 死循环</span></span>
<span class="line"><span>    for (;;) {</span></span>
<span class="line"><span>        // 拿到ctl</span></span>
<span class="line"><span>        int c = ctl.get();</span></span>
<span class="line"><span>        // 拿到线程池的状态</span></span>
<span class="line"><span>        int rs = runStateOf(c);</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        // 如果线程池状态是STOP，没有必要处理阻塞队列任务，直接返回null</span></span>
<span class="line"><span>        // 如果线程池状态是SHUTDOWN，并且阻塞队列是空的，直接返回null</span></span>
<span class="line"><span>        if (rs &gt;= SHUTDOWN &amp;&amp; </span></span>
<span class="line"><span>                (rs &gt;= STOP || workQueue.isEmpty())) {</span></span>
<span class="line"><span>            // 如果可以返回null，先扣减工作线程个数</span></span>
<span class="line"><span>            decrementWorkerCount();</span></span>
<span class="line"><span>            // 返回null，结束runWorker的while循环</span></span>
<span class="line"><span>            return null;</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        // 基于ctl拿到工作线程个数</span></span>
<span class="line"><span>        int wc = workerCountOf(c);</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        // 核心线程允许超时，timed为true</span></span>
<span class="line"><span>        // 工作线程个数大于核心线程数，timed为true</span></span>
<span class="line"><span>        boolean timed = allowCoreThreadTimeOut || wc &gt; corePoolSize;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        if (</span></span>
<span class="line"><span>            // 如果工作线程个数，大于最大线程数。（一般情况不会满足），把他看成false</span></span>
<span class="line"><span>            // 第二个判断代表，只要工作线程数小于等于核心线程数，必然为false</span></span>
<span class="line"><span>            // 即便工作线程个数大于核心线程数了，此时第一次循环也不会为true，因为timedOut默认值是false</span></span>
<span class="line"><span>            // 考虑第二次循环了，因为循环内部必然有修改timeOut的位置</span></span>
<span class="line"><span>            (wc &gt; maximumPoolSize || (timed &amp;&amp; timedOut))</span></span>
<span class="line"><span>            &amp;&amp; </span></span>
<span class="line"><span>            // 要么工作线程还有，要么阻塞队列为空，并且满足上述条件后，工作线程才会走到if内部，结束工作线程</span></span>
<span class="line"><span>            (wc &gt; 1 || workQueue.isEmpty())</span></span>
<span class="line"><span>           ) {</span></span>
<span class="line"><span>            // 第二次循环才有可能到这。</span></span>
<span class="line"><span>            // 正常结束，工作线程 - 1，因为是CAS操作，如果失败了，重新走for循环</span></span>
<span class="line"><span>            if (compareAndDecrementWorkerCount(c))</span></span>
<span class="line"><span>                return null;</span></span>
<span class="line"><span>            continue;</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        // 工作线程从阻塞队列拿任务</span></span>
<span class="line"><span>        try {</span></span>
<span class="line"><span>            // 如果是核心线程，timed是false，如果是非核心线程，timed就是true</span></span>
<span class="line"><span>            Runnable r = timed ?</span></span>
<span class="line"><span>                // 如果是非核心，走poll方法，拿任务，等待一会</span></span>
<span class="line"><span>                workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :</span></span>
<span class="line"><span>                // 如果是核心，走take方法，死等。</span></span>
<span class="line"><span>                workQueue.take();</span></span>
<span class="line"><span>            // 从阻塞队列拿到的任务不为null，这边就正常返回任务，去执行</span></span>
<span class="line"><span>            if (r != null)</span></span>
<span class="line"><span>                return r;</span></span>
<span class="line"><span>            // 说明当前线程没拿到任务，将timeOut设置为true，在上面就可以返回null退出了。</span></span>
<span class="line"><span>            timedOut = true;</span></span>
<span class="line"><span>        } catch (InterruptedException retry) {</span></span>
<span class="line"><span>            timedOut = false;</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre></div><h4 id="_3-3-8-threadpoolexecutor的关闭方法" tabindex="-1">3.3.8 ThreadPoolExecutor的关闭方法 <a class="header-anchor" href="#_3-3-8-threadpoolexecutor的关闭方法" aria-label="Permalink to &quot;3.3.8 ThreadPoolExecutor的关闭方法&quot;">​</a></h4><p>首先查看shutdownNow方法，可以从RUNNING状态转变为STOP</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>// shutDownNow方法，shutdownNow不会处理阻塞队列的任务，将任务全部给你返回了。</span></span>
<span class="line"><span>public List&lt;Runnable&gt; shutdownNow() {</span></span>
<span class="line"><span>    // 声明返回结果</span></span>
<span class="line"><span>    List&lt;Runnable&gt; tasks;</span></span>
<span class="line"><span>    // 加锁</span></span>
<span class="line"><span>    final ReentrantLock mainLock = this.mainLock;</span></span>
<span class="line"><span>    mainLock.lock();</span></span>
<span class="line"><span>    try {</span></span>
<span class="line"><span>        // 不关注这个方法……</span></span>
<span class="line"><span>        checkShutdownAccess();</span></span>
<span class="line"><span>        // 将线程池状态修改为STOP</span></span>
<span class="line"><span>        advanceRunState(STOP);</span></span>
<span class="line"><span>        // 无论怎么，直接中断工作线程。</span></span>
<span class="line"><span>        interruptWorkers();</span></span>
<span class="line"><span>        // 将阻塞队列的任务全部扔到List集合中。</span></span>
<span class="line"><span>        tasks = drainQueue();</span></span>
<span class="line"><span>    } finally {</span></span>
<span class="line"><span>        // 释放锁</span></span>
<span class="line"><span>        mainLock.unlock();</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    tryTerminate();</span></span>
<span class="line"><span>    return tasks;</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span></span></span>
<span class="line"><span>// 将线程池状态修改为STOP</span></span>
<span class="line"><span>private void advanceRunState(int STOP) {</span></span>
<span class="line"><span>    // 死循环。</span></span>
<span class="line"><span>    for (;;) {</span></span>
<span class="line"><span>        // 获取ctl属性的值</span></span>
<span class="line"><span>        int c = ctl.get();</span></span>
<span class="line"><span>        // 第一个判断：如果当前线程池状态已经大于等于STOP了，不管了，告辞。</span></span>
<span class="line"><span>        if (runStateAtLeast(c, STOP) ||</span></span>
<span class="line"><span>            // 基于CAS，将ctl从c修改为STOP状态，不修改工作线程个数，但是状态变为了STOP</span></span>
<span class="line"><span>            // 如果修改成功结束</span></span>
<span class="line"><span>            ctl.compareAndSet(c, ctlOf(STOP, workerCountOf(c))))</span></span>
<span class="line"><span>            break;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span>// 无论怎么，直接中断工作线程。</span></span>
<span class="line"><span>private void interruptWorkers() {</span></span>
<span class="line"><span>    final ReentrantLock mainLock = this.mainLock;</span></span>
<span class="line"><span>    mainLock.lock();</span></span>
<span class="line"><span>    try {</span></span>
<span class="line"><span>        // 遍历HashSet，拿到所有的工作线程，直接中断。</span></span>
<span class="line"><span>        for (Worker w : workers)</span></span>
<span class="line"><span>            w.interruptIfStarted();</span></span>
<span class="line"><span>    } finally {</span></span>
<span class="line"><span>        mainLock.unlock();</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span>// 移除阻塞队列，内容全部扔到List集合中</span></span>
<span class="line"><span>private List&lt;Runnable&gt; drainQueue() {</span></span>
<span class="line"><span>    BlockingQueue&lt;Runnable&gt; q = workQueue;</span></span>
<span class="line"><span>    ArrayList&lt;Runnable&gt; taskList = new ArrayList&lt;Runnable&gt;();</span></span>
<span class="line"><span>    // 阻塞队列自带的，直接清空阻塞队列，内容扔到List集合</span></span>
<span class="line"><span>    q.drainTo(taskList);</span></span>
<span class="line"><span>    // 为了避免任务丢失，重新判断，是否需要编辑阻塞队列，重新扔到List</span></span>
<span class="line"><span>    if (!q.isEmpty()) {</span></span>
<span class="line"><span>        for (Runnable r : q.toArray(new Runnable[0])) {</span></span>
<span class="line"><span>            if (q.remove(r))</span></span>
<span class="line"><span>                taskList.add(r);</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    return taskList;</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span></span></span>
<span class="line"><span>// 查看当前线程池是否可以变为TERMINATED状态</span></span>
<span class="line"><span>final void tryTerminate() {</span></span>
<span class="line"><span>    // 死循环。</span></span>
<span class="line"><span>    for (;;) {</span></span>
<span class="line"><span>        // 拿到ctl</span></span>
<span class="line"><span>        int c = ctl.get();</span></span>
<span class="line"><span>        // 如果是RUNNING，直接告辞。</span></span>
<span class="line"><span>        // 如果状态已经大于等于TIDYING，马上就要凉凉，直接告辞。</span></span>
<span class="line"><span>        // 如果状态是SHUTDOWN，但是阻塞队列还有任务，直接告辞。</span></span>
<span class="line"><span>        if (isRunning(c) ||</span></span>
<span class="line"><span>            runStateAtLeast(c, TIDYING) ||</span></span>
<span class="line"><span>            (runStateOf(c) == SHUTDOWN &amp;&amp; ! workQueue.isEmpty()))</span></span>
<span class="line"><span>            return;</span></span>
<span class="line"><span>        // 如果还有工作线程</span></span>
<span class="line"><span>        if (workerCountOf(c) != 0) { </span></span>
<span class="line"><span>            // 再次中断工作线程</span></span>
<span class="line"><span>            interruptIdleWorkers(ONLY_ONE);</span></span>
<span class="line"><span>            // 告辞，等你工作线程全完事，我这再尝试进入到TERMINATED状态</span></span>
<span class="line"><span>            return;</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        // 加锁，为了可以执行Condition的释放操作</span></span>
<span class="line"><span>        final ReentrantLock mainLock = this.mainLock;</span></span>
<span class="line"><span>        mainLock.lock();</span></span>
<span class="line"><span>        try {</span></span>
<span class="line"><span>            // 将线程池状态修改为TIDYING状态，如果成功，继续往下走</span></span>
<span class="line"><span>            if (ctl.compareAndSet(c, ctlOf(TIDYING, 0))) {</span></span>
<span class="line"><span>                try {</span></span>
<span class="line"><span>                    // 这个方法是空的，如果你需要在线程池关闭后做一些额外操作，这里你可以自行实现</span></span>
<span class="line"><span>                    terminated();</span></span>
<span class="line"><span>                } finally {</span></span>
<span class="line"><span>                    // 最终修改为TERMINATED状态</span></span>
<span class="line"><span>                    ctl.set(ctlOf(TERMINATED, 0));</span></span>
<span class="line"><span>                    // 线程池提供了一个方法，主线程在提交任务到线程池后，是可以继续做其他操作的。</span></span>
<span class="line"><span>                    // 咱们也可以让主线程提交任务后，等待线程池处理完毕，再做后续操作</span></span>
<span class="line"><span>                    // 这里线程池凉凉后，要唤醒哪些调用了awaitTermination方法的线程</span></span>
<span class="line"><span>                    termination.signalAll();</span></span>
<span class="line"><span>                }</span></span>
<span class="line"><span>                return;</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span>        } finally {</span></span>
<span class="line"><span>            mainLock.unlock();</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>        // else retry on failed CAS</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre></div><p>再次shutdown方法，可以从RUNNING状态转变为SHUTDOWN</p><p>shutdown状态下，不会中断正在干活的线程，而且会处理阻塞队列中的任务</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>public void shutdown() {</span></span>
<span class="line"><span>    // 加锁。。</span></span>
<span class="line"><span>    final ReentrantLock mainLock = this.mainLock;</span></span>
<span class="line"><span>    mainLock.lock();</span></span>
<span class="line"><span>    try {</span></span>
<span class="line"><span>        // 不看。</span></span>
<span class="line"><span>        checkShutdownAccess();</span></span>
<span class="line"><span>        // 里面是一个死循环，将线程池状态修改为SHUTDOWN</span></span>
<span class="line"><span>        advanceRunState(SHUTDOWN);</span></span>
<span class="line"><span>        // 中断空闲线程</span></span>
<span class="line"><span>        interruptIdleWorkers();</span></span>
<span class="line"><span>        // 说了，这个是为了ScheduleThreadPoolExecutor准备的，不管</span></span>
<span class="line"><span>        onShutdown(); </span></span>
<span class="line"><span>    } finally {</span></span>
<span class="line"><span>        mainLock.unlock();</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    // 尝试结束线程</span></span>
<span class="line"><span>    tryTerminate();</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span></span></span>
<span class="line"><span>// 中断空闲线程</span></span>
<span class="line"><span>private void interruptIdleWorkers(boolean onlyOne) {</span></span>
<span class="line"><span>    // 加锁</span></span>
<span class="line"><span>    final ReentrantLock mainLock = this.mainLock;</span></span>
<span class="line"><span>    mainLock.lock();</span></span>
<span class="line"><span>    try {</span></span>
<span class="line"><span>        for (Worker w : workers) {</span></span>
<span class="line"><span>            Thread t = w.thread;</span></span>
<span class="line"><span>            // 如果线程没有中断，那么就去获取Worker的锁，基于tryLock可知，不会中断正在干活的线程</span></span>
<span class="line"><span>            if (!t.isInterrupted() &amp;&amp; w.tryLock()) {</span></span>
<span class="line"><span>                try {</span></span>
<span class="line"><span>                    // 会中断空闲线程</span></span>
<span class="line"><span>                    t.interrupt();</span></span>
<span class="line"><span>                } catch (SecurityException ignore) {</span></span>
<span class="line"><span>                } finally {</span></span>
<span class="line"><span>                    w.unlock();</span></span>
<span class="line"><span>                }</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span>            if (onlyOne)</span></span>
<span class="line"><span>                break;</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>    } finally {</span></span>
<span class="line"><span>        mainLock.unlock();</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre></div><h3 id="_3-4-线程池的核心参数设计规则" tabindex="-1">3.4 线程池的核心参数设计规则 <a class="header-anchor" href="#_3-4-线程池的核心参数设计规则" aria-label="Permalink to &quot;3.4 线程池的核心参数设计规则&quot;">​</a></h3><p>线程池的使用难度不大，难度在于线程池的参数并不好配置。</p><p>主要难点在于任务类型无法控制，比如任务有CPU密集型，还有IO密集型，甚至还有混合型的。</p><p>因为IO咱们无法直接控制，所以很多时间按照一些书上提供的一些方法，是无法解决问题的。</p><p>《Java并发编程实践》</p><p>想调试出一个符合当前任务情况的核心参数，最好的方式就是测试。</p><p>需要将项目部署到测试环境或者是沙箱环境中，结果各种压测得到一个相对符合的参数。</p><p>如果每次修改项目都需要重新部署，成本太高了。</p><p>此时咱们可以实现一个动态监控以及修改线程池的方案。</p><p>因为线程池的核心参数无非就是：</p><ul><li><p>corePoolSize：核心线程数</p></li><li><p>maximumPoolSize：最大线程数</p></li><li><p>workQueue：工作队列</p></li></ul><p>线程池中提供了获取核心信息的get方法，同时也提供了动态修改核心属性的set方法。</p><p><img src="https://fynotefile.oss-cn-zhangjiakou.aliyuncs.com/fynote/fyfile/2746/1661937858024/d52b31cb12654481b26a11ddb6e5e4d2.png" alt="" loading="lazy"></p><p>也可以采用一些开源项目提供的方式去做监控和修改</p><p>比如hippo4j就可以对线程池进行监控，而且可以和SpringBoot整合。</p><p>Github地址：<a href="https://github.com/opengoofy/hippo4j" target="_blank" rel="noreferrer">https://github.com/opengoofy/hippo4j</a></p><p>官方文档：<a href="https://hippo4j.cn/docs/user_docs/intro" target="_blank" rel="noreferrer">https://hippo4j.cn/docs/user_docs/intro</a></p></div></div></main><footer class="VPDocFooter" data-v-767d2a17 data-v-2aedab7c><!--[--><!--]--><div class="edit-info" data-v-2aedab7c><!----><div class="last-updated" data-v-2aedab7c><p class="VPLastUpdated" data-v-2aedab7c data-v-1e47ff0b>Last updated: <time datetime="2024-04-24T09:42:17.000Z" data-v-1e47ff0b></time></p></div></div><nav class="prev-next" data-v-2aedab7c><div class="pager" data-v-2aedab7c><!----></div><div class="pager" data-v-2aedab7c><a class="VPLink link pager-link next" href="/01-Dev/01.01-Java/Cloud/Alibaba/Nacos/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.html" data-v-2aedab7c><!--[--><span class="desc" data-v-2aedab7c>Next page</span><span class="title" data-v-2aedab7c>源码分析</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-8bc02b95 data-v-9f0389bf><div class="container" data-v-9f0389bf><p class="message" data-v-9f0389bf>waitingresult.com</p><p class="copyright" data-v-9f0389bf>Copyright © 2024 Luyuan</p></div></footer><!--[--><!--]--></div></div>
    <script>window.__VP_HASH_MAP__=JSON.parse("{\"01-dev_01.01-java_cloud_alibaba_组件.md\":\"CtHKRwJl\",\"01-dev_01.01-java_java基础_serializable.md\":\"V7P0iY29\",\"01-dev_01.01-java_juc_信号量.md\":\"yPcLPIX5\",\"01-dev_01.01-java_cloud_higress.md\":\"NfwOROHk\",\"01-dev_01.01-java_cloud_alibaba_nacos_源码分析.md\":\"D-hK2-bU\",\"02-person_独立开发者_我是谁.md\":\"CZ64re_U\",\"01-dev_01.01-java_java基础_泛型.md\":\"7jKnrnvj\",\"01-dev_01.09-docker_docker软件安装_minio.md\":\"B1yVVVUl\",\"01-dev_01.08-数据库_03-redis_redis.md\":\"BVfYNONQ\",\"01-dev_01.98-八股_网络协议与netty面试题1.md\":\"CROxZ5cg\",\"02-person_问题思考_博客同步问题.md\":\"B0va-Yhy\",\"01-dev_01.03-网络安全_安全漏洞_fastjson序列化远程执行漏洞.md\":\"BkuB5Sks\",\"01-dev_01.98-八股_项目.md\":\"DGvfjksX\",\"01-dev_01.98-八股_网络协议与netty面试题2.md\":\"D4UywR4i\",\"index.md\":\"DuO_b2E5\",\"01-dev_01.06-算法_二分.md\":\"BaKtB0b8\",\"01-dev_01.07-linux_环境安装_ubuntu基础环境安装.md\":\"CbhQOVTG\",\"01-dev_01.07-linux_常用命令.md\":\"CiPkm-o5\",\"01-dev_01.98-八股_2023金九银十面试突击班1_mysql.md\":\"OoF3QkYa\",\"01-dev_01.04-计算机基础_基础数据结构_小陈.md\":\"DqcUhBMF\",\"01-dev_01.08-数据库_00-《mysql是怎么运行的》_04-《从一条记录说起》-innodb记录结构.md\":\"DbZHJx5w\",\"01-dev_01.01-java_juc_线程池.md\":\"BqUa7ZRk\",\"01-dev_01.01-java_jvm_03-jvm内存模型.md\":\"DG3IlZcc\",\"01-dev_01.99-plugins_obsidian插件开发_obsidian插件开发.md\":\"NMy5iFDc\",\"修改configts.md\":\"C9qPrRyq\",\"02-person_业务学习_10-搜索系统_02.搜广推核心业务链路.md\":\"C5YJLTr7\",\"01-dev_01.03-网络安全_安全漏洞_nacos-2.1以下的未授权访问漏洞.md\":\"ET2GPUYC\",\"01-dev_01.02-前端_vue_00-快速入门.md\":\"smm3vJDx\",\"01-dev_01.98-八股_01-java基础面试专题(上).md\":\"lh5_aXsM\",\"01-dev_01.04-计算机基础_基础数据结构_链表.md\":\"DNXT0KRb\",\"01-dev_01.03-网络安全_02-常见安全问题.md\":\"CMfX-VTP\",\"02-person_业务学习_04-跨境物流进出口业务_基础扫盲.md\":\"jY6ZdfhR\",\"01-dev_01.99-plugins_ob.md\":\"Iw01DECZ\",\"02-person_业务学习_05-订单履约_仓配计费_组网优先级.md\":\"BzCDRQ8w\",\"02-person_独立开发者_独立开发者的思考.md\":\"PfAQT0fA\",\"guide_index.md\":\"CV6i7zhw\",\"02-person_业务学习_07-归因系统_简介.md\":\"CqLuKIa-\",\"02-person_独立开发者_独立开发多人（远程）协作经验分享.md\":\"_CDaqPZB\",\"01-dev_01.01-java_jvm_01-类加载机制.md\":\"DsuPyGza\",\"01-dev_01.01-java_jvm_04-jvm的垃圾收集算法.md\":\"BAY1aHI7\",\"03-me_index.md\":\"CqUsSESv\",\"02-person_独立开发者_资源站点.md\":\"tR4700Qk\",\"02-person_博客搭建_需求.md\":\"BRC3jG-k\",\"support.md\":\"ClpJiU2W\",\"01-dev_01.13-es_01-es入门.md\":\"4QrH9roP\",\"01-dev_01.13-es_02-spring整合es.md\":\"BmPeatOv\",\"01-dev_01.12-devops_云效流水线构建.md\":\"DYBCdl5f\",\"01-dev_01.13-es_03-es数据同步问题.md\":\"pl4O5Z2s\",\"01-dev_01.13-es_00-docker方式安装单机版es、kibana、ik分词、可视化.md\":\"OdUPUFK9\",\"01-dev_01.69-技术规范_01-探索日志规约.md\":\"D_aLv2er\",\"01-dev_01.60-书籍相关_经典编程书单500mb.md\":\"QH3YRVMR\",\"01-dev_01.14-job_powerjob.md\":\"Ce-jYFqh\",\"01-dev_01.70-业务解决方案_do对象嵌套的特殊处理.md\":\"_4QYbCl5\",\"01-dev_01.70-业务解决方案_springboot_自定义-start_未命名.md\":\"BtDAVyOx\",\"02-person_业务学习_08-营销系统_00-营销系统简介.md\":\"B8suBl20\",\"01-dev_01.08-数据库_02-mysql_问题引导学习.md\":\"DK3acd9w\",\"01-dev_01.98-八股_02-java基础面试专题(中).md\":\"C2Bwc_F1\",\"01-dev_01.70-业务解决方案_加密_excel_word文件加密.md\":\"DLPQvdMr\",\"01-dev_01.09-docker_01-dockercompose_常用-环境服务-dockerfile.md\":\"DuLa0_mC\",\"01-dev_01.08-数据库_03-redis_redis-入门基础.md\":\"fdEFSH_k\",\"01-dev_01.12-devops_jenkins.md\":\"Dz-vfG0f\",\"01-dev_01.09-docker_从零学docker.md\":\"CQ-6hnW5\",\"02-person_业务学习_11-推荐系统_10-买了又买页逻辑.md\":\"Cm0hfgbG\",\"01-dev_01.70-业务解决方案_幂等处理.md\":\"C65D-zmB\",\"01-dev_01.70-业务解决方案_日志_traceid问题.md\":\"Crch4DZn\",\"01-dev_01.70-业务解决方案_springboot_event观察者.md\":\"YY3v6tau\",\"02-person_业务学习_11-推荐系统_学习资源.md\":\"CcLXEKg5\",\"01-dev_01.68-ddd_充血模型与贫血模型.md\":\"CtBXjbI0\",\"02-person_业务学习_12-广告系统_00-广告前置业务知识.md\":\"CWoAECJw\",\"01-dev_01.70-业务解决方案_springboot_spel表达式.md\":\"DF1-8Rzd\",\"01-dev_01.70-业务解决方案_springboot_springbootapplication注解.md\":\"CzHjOjkP\",\"02-person_博客搭建_vitepress.md\":\"DTngXpKw\",\"01-dev_01.60-书籍相关_《如何学习业务》_如何学习业务.md\":\"DCnXT7pe\",\"02-person_业务学习_13-网红联盟营销_01-网红和联盟之间的关系.md\":\"DkytKLLz\",\"02-person_博客搭建_index.md\":\"7jdtTmi_\",\"01-dev_01.04-计算机基础_计算机网络_网络协议-tcp-ip.md\":\"CIXXVAp_\",\"01-dev_01.04-计算机基础_鸟哥私房菜.md\":\"C8A5BSSq\",\"01-dev_01.01-java_juc_多线程.md\":\"CUBOjKMK\",\"01-dev_01.08-数据库_00-《mysql是怎么运行的》_01-《装作自己是个小白》-初识mysql.md\":\"D1h8YR8F\",\"01-dev_01.98-八股_2023金九银十面试突击班2_jvm.md\":\"wVzUCk29\",\"01-dev_01.06-算法_排序_冒泡.md\":\"jVLVDk_L\",\"01-dev_01.06-算法_排序_插入.md\":\"gdtvx1-G\",\"01-dev_01.05-设计模式_01-深入设计模式_01-面向对象程序设计简介.md\":\"w9_MpeOh\",\"01-dev_01.05-设计模式_行为型_责任链.md\":\"DyX9JwOg\",\"01-dev_01.06-算法_01-前言.md\":\"B71pH1lq\",\"01-dev_01.05-设计模式_行为型_策略.md\":\"hmuNwTBd\",\"01-dev_01.05-设计模式_前言.md\":\"CUU5Sg6K\",\"01-dev_01.05-设计模式_涉及设计模式.md\":\"bDZHAfL5\",\"01-dev_01.04-计算机基础_计算机组成原理_什么是偏移量.md\":\"DJ2tE-NP\",\"01-dev_01.06-算法_排序_选择.md\":\"CpQFfRlX\",\"01-dev_01.05-设计模式_《美团技术》设计模式在外卖营销业务中的实践.md\":\"Bqrt0yjW\",\"01-dev_01.06-算法_02-导读.md\":\"D3Gvd30U\",\"01-dev_01.05-设计模式_创建型_单例.md\":\"Cb2UEiH8\",\"01-dev_01.06-算法_算法路线.md\":\"DrFVVgGr\",\"01-dev_01.06-算法_业务算法_dfa.md\":\"CAq14nsA\",\"01-dev_01.06-算法_业务算法_装箱算法.md\":\"CKxuhVNR\",\"01-dev_01.05-设计模式_结构型_代理.md\":\"CPgywD4e\",\"01-dev_01.05-设计模式_结构型_门面.md\":\"CXys7hXl\",\"01-dev_01.07-linux_环境安装_linux安装jdk.md\":\"DmBtF2gT\",\"01-dev_01.07-linux_环境安装_基础环境问题.md\":\"DAQCgDDk\",\"01-dev_01.03-网络安全_01-网络安全简介.md\":\"B1rU-4uO\",\"01-dev_01.08-数据库_00-《mysql是怎么运行的》_02-《mysql的调控按钮》-启动选项与环境变量.md\":\"B08U4YPr\",\"01-dev_01.99-plugins_site.md\":\"D98uRnxx\",\"01-dev_index.md\":\"DMnEeJmM\",\"01-dev_01.07-linux_虚拟机_virtualbox.md\":\"B30Prsh5\",\"02-person_index.md\":\"D7XQDYpi\",\"02-person_seo_index.md\":\"DUKssnFc\",\"02-person_博文成长_个人提升_掌握习惯.md\":\"BpwMtZR_\",\"02-person_笔记整理.md\":\"7aOelsnI\",\"02-person_业务学习_03-如何快速接手项目.md\":\"uu5BZmHc\",\"02-person_业务学习_00-简介.md\":\"C7gLs53p\",\"02-person_博文成长_井底之蛙_业务模式.md\":\"CfClRnzN\",\"01-dev_01.98-八股_常见问题.md\":\"pZxdKihf\",\"01-dev_01.01-java_jvm_00-前言.md\":\"B1LPndk7\",\"04-team_index.md\":\"66Q7l247\",\"02-person_独立开发者_index.md\":\"CJa2ZY9v\",\"02-person_问题思考_obsidian笔记中的标签自闭合问题.md\":\"BX8kaAw3\",\"01-dev_01.08-数据库_02-mysql_mysql特殊命令.md\":\"B47vSkuj\",\"02-person_博客搭建_vitepress 动态目录.md\":\"-ocWGeH9\",\"01-dev_01.98-八股_并发编程突击班-集合篇.md\":\"_xgbYwrW\",\"01-dev_01.99-plugins_mybatiscodehelper离线激活分析.md\":\"BOR94lfd\",\"01-dev_01.01-java_index.md\":\"DZk7ZA7o\",\"01-dev_01.98-八股_并发编程突击班-锁篇.md\":\"C41JaCpq\",\"01-dev_01.02-前端_npm_pnpm.md\":\"zuRKKrEa\",\"02-person_业务学习_08-营销系统_01-营销业务相关问题.md\":\"CnqJGVC9\",\"02-person_博文成长_guide_程序人生_开发同学须知.md\":\"Dwvhp2DK\",\"01-dev_01.98-八股_金九银十面试突击班3.md\":\"BU9_GGcz\",\"02-person_博文成长_index.md\":\"Cf6qPWKi\",\"01-dev_01.98-八股_并发编程突击班-基础篇.md\":\"CYUGWQuF\",\"01-dev_01.08-数据库_02-mysql_碎片清理方案.md\":\"CHPh2rnm\",\"01-dev_01.01-java_juc_volatile关键字.md\":\"AIcsykr7\",\"01-dev_01.08-数据库_00-《mysql是怎么运行的》_03-《乱码的前世今生》-字符集和比较规则.md\":\"Bdko4D8M\",\"02-person_博文成长_井底之蛙_提前做的思想准备.md\":\"SveSmB8W\",\"01-dev_01.04-计算机基础_系统设计_ddd是什么.md\":\"Cc0AR6ZQ\",\"links.md\":\"Bat9y_Ut\",\"01-dev_01.08-数据库_02-mysql_mysql整体架构解析.md\":\"TUCLzzML\",\"01-dev_01.08-数据库_01-《mysql-binlog神秘面纱》_01-mysql-binlog.md\":\"Dpr_6LVY\",\"01-dev_01.01-java_jvm_02-运行时数据区.md\":\"Ctcfax2O\",\"02-person_业务学习_11-推荐系统_00-相关书籍_《推荐系统技术评估及高效算法》_01-概述.md\":\"cbTxNQ5Z\",\"01-dev_01.01-java_jvm_06-java对象的内存模型布局.md\":\"ASOs-4I_\",\"01-dev_01.07-linux_linux自定义系统服务-服务脚本编写（开机自启）.md\":\"DtIr5PEB\",\"02-person_业务学习_01-跨境电商独立站-简介.md\":\"BJCaD8aG\",\"02-person_业务学习_02-跨境电商前置知识.md\":\"Em8Q4LLt\",\"01-dev_01.02-前端_npm_npm镜像切换.md\":\"CaY_BcSr\",\"01-dev_01.01-java_juc_condition接口.md\":\"pRrThDqp\",\"01-dev_01.99-plugins_开发相关.md\":\"uPPZUPjP\",\"01-dev_01.09-docker_docker命令.md\":\"irtOxTjM\",\"01-dev_01.07-linux_虚拟机_windows安装linux子系统.md\":\"CpG8_L1B\",\"01-dev_01.98-八股_经典框架源码面试题.md\":\"CzMeWTFg\",\"01-dev_01.01-java_jvm_05-双亲委派模型.md\":\"BVi5PE4d\",\"01-dev_01.06-算法_基础知识.md\":\"CYFQ44Hc\",\"02-person_博客搭建_obs_vitepress_githubaction实现同步.md\":\"BZF9ayVz\",\"01-dev_01.02-前端_vue_01-基础语法.md\":\"DqtJtQTF\",\"01-dev_01.01-java_juc_锁.md\":\"CFJTDUJL\",\"01-dev_01.01-java_系统优化.md\":\"DRwPlV9E\",\"01-dev_01.01-java_juc_01-并发编程_并发编程-02.md\":\"CFn--oRQ\",\"02-person_问题思考_定时任务注入为null.md\":\"CGeYvT-P\",\"01-dev_01.14-job_00-docker镜像方式搭建调度中心.md\":\"BN-rkz9b\",\"01-dev_01.98-八股_03-java基础面试专题(下).md\":\"fld8O3jg\",\"02-person_业务学习_10-搜索系统_00-简介.md\":\"BZApXWoM\",\"01-dev_01.98-八股_2023金九银十面试突击班2_mysql.md\":\"B6FsVUkt\",\"01-dev_01.02-前端_02-常用代码段.md\":\"CJFANVFG\",\"02-person_业务学习_08-营销系统_02-价格体系.md\":\"gKYQJeCV\",\"01-dev_01.07-linux_环境安装_linux安装docker.md\":\"CMsWR90o\",\"01-dev_01.03-网络安全_00-常用网站.md\":\"Bz_ar0Sp\",\"01-dev_01.02-前端_01-前端学习路线.md\":\"BvwEkj-c\",\"01-dev_01.98-八股_网络协议与netty面试题3.md\":\"CRSSSa1v\",\"01-dev_01.01-java_juc_future.md\":\"CrxjRY2Y\",\"02-person_业务学习_11-推荐系统_00-《推荐系统从入门到放弃》_02-架构设计.md\":\"BhO7xHkQ\",\"01-dev_01.12-devops_前言.md\":\"rUTRwHMO\",\"01-dev_01.99-plugins_obsidian插件开发_快速入门.md\":\"CKrSZIz5\",\"02-person_博客搭建_github与gitee的同步方案.md\":\"DLHfIw4z\",\"01-dev_01.70-业务解决方案_springboot_springboot-start.md\":\"Bjh1D3Ic\",\"01-dev_01.03-网络安全_00-大纲路线.md\":\"CQn5nVhi\",\"01-dev_01.05-设计模式_行为型_模板.md\":\"CU6xHFh2\",\"02-person_业务学习_11-推荐系统_00-《推荐系统从入门到放弃》_01-概述.md\":\"6X7Oc2sG\",\"02-person_博客搭建_rss处理.md\":\"Pgrh3g_t\",\"01-dev_01.98-八股_2023金九银十面试突击班_jvm.md\":\"DcrWxOYj\",\"02-person_业务学习_13-网红联盟营销_00-简介.md\":\"Bt6rf1FT\",\"01-dev_01.02-前端_疑问.md\":\"6rSOTUb6\",\"01-dev_01.01-java_juc_01-并发编程_并发编程-01.md\":\"xjYllJmq\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"zh-CN\",\"dir\":\"ltr\",\"title\":\"陆远的知识库\",\"description\":\"个人技术知识库，记录 & 分享个人碎片化、结构化、体系化的技术知识内容。\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"carbonAds\":{\"code\":\"your-carbon-code\",\"placement\":\"your-carbon-placement\"},\"outline\":{\"label\":\"目录\"},\"logo\":\"/favicon.jpg\",\"search\":{\"provider\":\"local\"},\"nav\":[{\"text\":\"🚀首页\",\"link\":\"/\"},{\"text\":\"🌱指南\",\"items\":[{\"text\":\"Dev\",\"items\":[{\"text\":\"Dev\",\"link\":\"/01-Dev/\"}]},{\"text\":\"个人\",\"items\":[{\"text\":\"SEO\",\"link\":\"/02-Person/SEO/\"},{\"text\":\"业务学习\",\"link\":\"/02-Person/业务学习/简介\"},{\"text\":\"博客搭建\",\"link\":\"/02-Person/博客搭建/\"},{\"text\":\"博文成长\",\"link\":\"/02-Person/博文成长/\"},{\"text\":\"独立开发者\",\"link\":\"/02-Person/独立开发者/\"},{\"text\":\"问题思考\",\"link\":\"/02-Person/问题思考/\"}]}]},{\"text\":\"🏷️归档\",\"items\":[{\"text\":\"🚩分类\",\"link\":\"/05-Category/\"},{\"text\":\"🏷️标签\",\"link\":\"/06-Tags/\"}]},{\"text\":\"💫关于\",\"items\":[{\"text\":\"🦁团队\",\"link\":\"/04-Team/\"},{\"text\":\"💫关于我\",\"link\":\"/03-Me/\"},{\"text\":\"💸支持\",\"link\":\"/support\"},{\"text\":\"🔊RSS订阅\",\"link\":\"/rss.xml\"}]}],\"darkModeSwitchLabel\":\"浅/深色模式切换\",\"darkModeSwitchTitle\":\"切换到深色模式\",\"lightModeSwitchTitle\":\"切换到浅色模式\",\"sidebar\":[{\"text\":\"01 Dev\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"01.01 Java\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Cloud\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Alibaba\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Nacos\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"源码分析\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\Cloud\\\\Alibaba\\\\Nacos\\\\源码分析.md\"}]},{\"text\":\"组件\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\Cloud\\\\Alibaba\\\\组件.md\"}]},{\"text\":\"Higress\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\Cloud\\\\Higress.md\"}]},{\"text\":\"Index\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\index.md\"},{\"text\":\"Java基础\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Serializable\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\Java基础\\\\Serializable.md\"},{\"text\":\"泛型\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\Java基础\\\\泛型.md\"}]},{\"text\":\"JUC\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"01 并发编程\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"并发编程 01\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\JUC\\\\01-并发编程\\\\并发编程-01.md\"},{\"text\":\"并发编程 02\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\JUC\\\\01-并发编程\\\\并发编程-02.md\"}]},{\"text\":\"Condition接口\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\JUC\\\\Condition接口.md\"},{\"text\":\"Future\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\JUC\\\\Future.md\"},{\"text\":\"Volatile关键字\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\JUC\\\\Volatile关键字.md\"},{\"text\":\"信号量\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\JUC\\\\信号量.md\"},{\"text\":\"多线程\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\JUC\\\\多线程.md\"},{\"text\":\"线程池\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\JUC\\\\线程池.md\"},{\"text\":\"锁\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\JUC\\\\锁.md\"}]},{\"text\":\"JVM\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"00 前言\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\JVM\\\\00-前言.md\"},{\"text\":\"01 类加载机制\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\JVM\\\\01-类加载机制.md\"},{\"text\":\"02 运行时数据区\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\JVM\\\\02-运行时数据区.md\"},{\"text\":\"03 JVM内存模型\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\JVM\\\\03-JVM内存模型.md\"},{\"text\":\"04 JVM的垃圾收集算法\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\JVM\\\\04-JVM的垃圾收集算法.md\"},{\"text\":\"05 双亲委派模型\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\JVM\\\\05-双亲委派模型.md\"},{\"text\":\"06 Java对象的内存模型布局\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\JVM\\\\06-Java对象的内存模型布局.md\"}]},{\"text\":\"系统优化\",\"link\":\"\\\\01-Dev\\\\01.01-Java\\\\系统优化.md\"}]},{\"text\":\"01.02 前端\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"01 前端学习路线\",\"link\":\"\\\\01-Dev\\\\01.02-前端\\\\01-前端学习路线.md\"},{\"text\":\"02 常用代码段\",\"link\":\"\\\\01-Dev\\\\01.02-前端\\\\02-常用代码段.md\"},{\"text\":\"Npm\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Npm镜像切换\",\"link\":\"\\\\01-Dev\\\\01.02-前端\\\\Npm\\\\Npm镜像切换.md\"},{\"text\":\"Pnpm\",\"link\":\"\\\\01-Dev\\\\01.02-前端\\\\Npm\\\\pnpm.md\"}]},{\"text\":\"Vue\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"00 快速入门\",\"link\":\"\\\\01-Dev\\\\01.02-前端\\\\Vue\\\\00-快速入门.md\"},{\"text\":\"01 基础语法\",\"link\":\"\\\\01-Dev\\\\01.02-前端\\\\Vue\\\\01-基础语法.md\"}]},{\"text\":\"疑问\",\"link\":\"\\\\01-Dev\\\\01.02-前端\\\\疑问.md\"}]},{\"text\":\"01.03 网络安全\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"00 大纲路线\",\"link\":\"\\\\01-Dev\\\\01.03-网络安全\\\\00-大纲路线.md\"},{\"text\":\"00 常用网站\",\"link\":\"\\\\01-Dev\\\\01.03-网络安全\\\\00-常用网站.md\"},{\"text\":\"01 网络安全简介\",\"link\":\"\\\\01-Dev\\\\01.03-网络安全\\\\01-网络安全简介.md\"},{\"text\":\"02 常见安全问题\",\"link\":\"\\\\01-Dev\\\\01.03-网络安全\\\\02-常见安全问题.md\"},{\"text\":\"安全漏洞\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"FastJSON序列化远程执行漏洞\",\"link\":\"\\\\01-Dev\\\\01.03-网络安全\\\\安全漏洞\\\\FastJSON序列化远程执行漏洞.md\"},{\"text\":\"Nacos 2.1以下的未授权访问漏洞\",\"link\":\"\\\\01-Dev\\\\01.03-网络安全\\\\安全漏洞\\\\Nacos-2.1以下的未授权访问漏洞.md\"}]}]},{\"text\":\"01.04 计算机基础\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"基础数据结构\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"小陈\",\"link\":\"\\\\01-Dev\\\\01.04-计算机基础\\\\基础数据结构\\\\小陈.md\"},{\"text\":\"链表\",\"link\":\"\\\\01-Dev\\\\01.04-计算机基础\\\\基础数据结构\\\\链表.md\"}]},{\"text\":\"系统设计\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"DDD是什么\",\"link\":\"\\\\01-Dev\\\\01.04-计算机基础\\\\系统设计\\\\DDD是什么.md\"}]},{\"text\":\"计算机组成原理\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"什么是偏移量\",\"link\":\"\\\\01-Dev\\\\01.04-计算机基础\\\\计算机组成原理\\\\什么是偏移量.md\"}]},{\"text\":\"计算机网络\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"网络协议 TCP IP\",\"link\":\"\\\\01-Dev\\\\01.04-计算机基础\\\\计算机网络\\\\网络协议-TCP-IP.md\"}]},{\"text\":\"鸟哥私房菜\",\"link\":\"\\\\01-Dev\\\\01.04-计算机基础\\\\鸟哥私房菜.md\"}]},{\"text\":\"01.05 设计模式\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"01 深入设计模式\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"01 面向对象程序设计简介\",\"link\":\"\\\\01-Dev\\\\01.05-设计模式\\\\01-深入设计模式\\\\01-面向对象程序设计简介.md\"}]},{\"text\":\"《美团技术》设计模式在外卖营销业务中的实践\",\"link\":\"\\\\01-Dev\\\\01.05-设计模式\\\\《美团技术》设计模式在外卖营销业务中的实践.md\"},{\"text\":\"创建型\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"单例\",\"link\":\"\\\\01-Dev\\\\01.05-设计模式\\\\创建型\\\\单例.md\"}]},{\"text\":\"前言\",\"link\":\"\\\\01-Dev\\\\01.05-设计模式\\\\前言.md\"},{\"text\":\"涉及设计模式\",\"link\":\"\\\\01-Dev\\\\01.05-设计模式\\\\涉及设计模式.md\"},{\"text\":\"结构型\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"代理\",\"link\":\"\\\\01-Dev\\\\01.05-设计模式\\\\结构型\\\\代理.md\"},{\"text\":\"门面\",\"link\":\"\\\\01-Dev\\\\01.05-设计模式\\\\结构型\\\\门面.md\"}]},{\"text\":\"行为型\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"模板\",\"link\":\"\\\\01-Dev\\\\01.05-设计模式\\\\行为型\\\\模板.md\"},{\"text\":\"策略\",\"link\":\"\\\\01-Dev\\\\01.05-设计模式\\\\行为型\\\\策略.md\"},{\"text\":\"责任链\",\"link\":\"\\\\01-Dev\\\\01.05-设计模式\\\\行为型\\\\责任链.md\"}]}]},{\"text\":\"01.06 算法\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"01 前言\",\"link\":\"\\\\01-Dev\\\\01.06-算法\\\\01-前言.md\"},{\"text\":\"02 导读\",\"link\":\"\\\\01-Dev\\\\01.06-算法\\\\02-导读.md\"},{\"text\":\"业务算法\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"DFA\",\"link\":\"\\\\01-Dev\\\\01.06-算法\\\\业务算法\\\\DFA.md\"},{\"text\":\"装箱算法\",\"link\":\"\\\\01-Dev\\\\01.06-算法\\\\业务算法\\\\装箱算法.md\"}]},{\"text\":\"二分\",\"link\":\"\\\\01-Dev\\\\01.06-算法\\\\二分.md\"},{\"text\":\"基础知识\",\"link\":\"\\\\01-Dev\\\\01.06-算法\\\\基础知识.md\"},{\"text\":\"排序\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"冒泡\",\"link\":\"\\\\01-Dev\\\\01.06-算法\\\\排序\\\\冒泡.md\"},{\"text\":\"插入\",\"link\":\"\\\\01-Dev\\\\01.06-算法\\\\排序\\\\插入.md\"},{\"text\":\"选择\",\"link\":\"\\\\01-Dev\\\\01.06-算法\\\\排序\\\\选择.md\"}]},{\"text\":\"算法路线\",\"link\":\"\\\\01-Dev\\\\01.06-算法\\\\算法路线.md\"}]},{\"text\":\"01.07 Linux\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Linux自定义系统服务 服务脚本编写（开机自启）\",\"link\":\"\\\\01-Dev\\\\01.07-Linux\\\\Linux自定义系统服务-服务脚本编写（开机自启）.md\"},{\"text\":\"常用命令\",\"link\":\"\\\\01-Dev\\\\01.07-Linux\\\\常用命令.md\"},{\"text\":\"环境安装\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Linux安装docker\",\"link\":\"\\\\01-Dev\\\\01.07-Linux\\\\环境安装\\\\Linux安装docker.md\"},{\"text\":\"Linux安装jdk\",\"link\":\"\\\\01-Dev\\\\01.07-Linux\\\\环境安装\\\\Linux安装jdk.md\"},{\"text\":\"Ubuntu基础环境安装\",\"link\":\"\\\\01-Dev\\\\01.07-Linux\\\\环境安装\\\\Ubuntu基础环境安装.md\"},{\"text\":\"基础环境问题\",\"link\":\"\\\\01-Dev\\\\01.07-Linux\\\\环境安装\\\\基础环境问题.md\"}]},{\"text\":\"虚拟机\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"VirtualBox\",\"link\":\"\\\\01-Dev\\\\01.07-Linux\\\\虚拟机\\\\VirtualBox.md\"},{\"text\":\"Windows安装linux子系统\",\"link\":\"\\\\01-Dev\\\\01.07-Linux\\\\虚拟机\\\\windows安装linux子系统.md\"}]}]},{\"text\":\"01.08 数据库\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"00 《MySQL是怎么运行的》\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"01 《装作自己是个小白》 初识MySQL\",\"link\":\"\\\\01-Dev\\\\01.08-数据库\\\\00-《MySQL是怎么运行的》\\\\01-《装作自己是个小白》-初识MySQL.md\"},{\"text\":\"02 《Mysql的调控按钮》 启动选项与环境变量\",\"link\":\"\\\\01-Dev\\\\01.08-数据库\\\\00-《MySQL是怎么运行的》\\\\02-《Mysql的调控按钮》-启动选项与环境变量.md\"},{\"text\":\"03 《乱码的前世今生》 字符集和比较规则\",\"link\":\"\\\\01-Dev\\\\01.08-数据库\\\\00-《MySQL是怎么运行的》\\\\03-《乱码的前世今生》-字符集和比较规则.md\"},{\"text\":\"04 《从一条记录说起》 InnoDB记录结构\",\"link\":\"\\\\01-Dev\\\\01.08-数据库\\\\00-《MySQL是怎么运行的》\\\\04-《从一条记录说起》-InnoDB记录结构.md\"}]},{\"text\":\"01 《Mysql BinLog神秘面纱》\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"01 MySQL BinLog\",\"link\":\"\\\\01-Dev\\\\01.08-数据库\\\\01-《Mysql-BinLog神秘面纱》\\\\01-MySQL-BinLog.md\"}]},{\"text\":\"02 Mysql\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"MySQL整体架构解析\",\"link\":\"\\\\01-Dev\\\\01.08-数据库\\\\02-Mysql\\\\MySQL整体架构解析.md\"},{\"text\":\"Mysql特殊命令\",\"link\":\"\\\\01-Dev\\\\01.08-数据库\\\\02-Mysql\\\\Mysql特殊命令.md\"},{\"text\":\"碎片清理方案\",\"link\":\"\\\\01-Dev\\\\01.08-数据库\\\\02-Mysql\\\\碎片清理方案.md\"},{\"text\":\"问题引导学习\",\"link\":\"\\\\01-Dev\\\\01.08-数据库\\\\02-Mysql\\\\问题引导学习.md\"}]},{\"text\":\"03 Redis\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Redis 入门基础\",\"link\":\"\\\\01-Dev\\\\01.08-数据库\\\\03-Redis\\\\Redis-入门基础.md\"},{\"text\":\"Redis\",\"link\":\"\\\\01-Dev\\\\01.08-数据库\\\\03-Redis\\\\Redis.md\"}]}]},{\"text\":\"01.09 Docker\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"01 DockerCompose\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"常用 环境服务 DockerFile\",\"link\":\"\\\\01-Dev\\\\01.09-Docker\\\\01-DockerCompose\\\\常用-环境服务-DockerFile.md\"}]},{\"text\":\"Docker命令\",\"link\":\"\\\\01-Dev\\\\01.09-Docker\\\\Docker命令.md\"},{\"text\":\"Docker软件安装\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"MinIo\",\"link\":\"\\\\01-Dev\\\\01.09-Docker\\\\docker软件安装\\\\MinIo.md\"}]},{\"text\":\"从零学Docker\",\"link\":\"\\\\01-Dev\\\\01.09-Docker\\\\从零学Docker.md\"}]},{\"text\":\"01.12 DevOps\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Jenkins\",\"link\":\"\\\\01-Dev\\\\01.12-DevOps\\\\Jenkins.md\"},{\"text\":\"云效流水线构建\",\"link\":\"\\\\01-Dev\\\\01.12-DevOps\\\\云效流水线构建.md\"},{\"text\":\"前言\",\"link\":\"\\\\01-Dev\\\\01.12-DevOps\\\\前言.md\"}]},{\"text\":\"01.13 Es\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"00 docker方式安装单机版es、kibana、ik分词、可视化\",\"link\":\"\\\\01-Dev\\\\01.13-Es\\\\00-docker方式安装单机版es、kibana、ik分词、可视化.md\"},{\"text\":\"01 ES入门\",\"link\":\"\\\\01-Dev\\\\01.13-Es\\\\01-ES入门.md\"},{\"text\":\"02 Spring整合Es\",\"link\":\"\\\\01-Dev\\\\01.13-Es\\\\02-Spring整合Es.md\"},{\"text\":\"03 Es数据同步问题\",\"link\":\"\\\\01-Dev\\\\01.13-Es\\\\03-Es数据同步问题.md\"}]},{\"text\":\"01.14 Job\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"00 Docker镜像方式搭建调度中心\",\"link\":\"\\\\01-Dev\\\\01.14-Job\\\\00-Docker镜像方式搭建调度中心.md\"},{\"text\":\"PowerJob\",\"link\":\"\\\\01-Dev\\\\01.14-Job\\\\PowerJob.md\"}]},{\"text\":\"01.60 书籍相关\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"《如何学习业务》\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"如何学习业务\",\"link\":\"\\\\01-Dev\\\\01.60-书籍相关\\\\《如何学习业务》\\\\如何学习业务.md\"}]},{\"text\":\"经典编程书单500MB\",\"link\":\"\\\\01-Dev\\\\01.60-书籍相关\\\\经典编程书单500MB.md\"}]},{\"text\":\"01.68 DDD\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"充血模型与贫血模型\",\"link\":\"\\\\01-Dev\\\\01.68-DDD\\\\充血模型与贫血模型.md\"}]},{\"text\":\"01.69 技术规范\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"01 探索日志规约\",\"link\":\"\\\\01-Dev\\\\01.69-技术规范\\\\01-探索日志规约.md\"}]},{\"text\":\"01.70 业务解决方案\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"DO对象嵌套的特殊处理\",\"link\":\"\\\\01-Dev\\\\01.70-业务解决方案\\\\DO对象嵌套的特殊处理.md\"},{\"text\":\"SpringBoot\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Event观察者\",\"link\":\"\\\\01-Dev\\\\01.70-业务解决方案\\\\SpringBoot\\\\Event观察者.md\"},{\"text\":\"SpEL表达式\",\"link\":\"\\\\01-Dev\\\\01.70-业务解决方案\\\\SpringBoot\\\\SpEL表达式.md\"},{\"text\":\"SpringBoot Start\",\"link\":\"\\\\01-Dev\\\\01.70-业务解决方案\\\\SpringBoot\\\\SpringBoot-Start.md\"},{\"text\":\"SpringBootApplication注解\",\"link\":\"\\\\01-Dev\\\\01.70-业务解决方案\\\\SpringBoot\\\\SpringBootApplication注解.md\"},{\"text\":\"自定义 start\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"未命名\",\"link\":\"\\\\01-Dev\\\\01.70-业务解决方案\\\\SpringBoot\\\\自定义-start\\\\未命名.md\"}]}]},{\"text\":\"加密\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Excel&Word文件加密\",\"link\":\"\\\\01-Dev\\\\01.70-业务解决方案\\\\加密\\\\Excel&Word文件加密.md\"}]},{\"text\":\"幂等处理\",\"link\":\"\\\\01-Dev\\\\01.70-业务解决方案\\\\幂等处理.md\"},{\"text\":\"日志\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"TraceId问题\",\"link\":\"\\\\01-Dev\\\\01.70-业务解决方案\\\\日志\\\\TraceId问题.md\"}]}]},{\"text\":\"01.98 八股\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"01 Java基础面试专题(上)\",\"link\":\"\\\\01-Dev\\\\01.98-八股\\\\01-Java基础面试专题(上).md\"},{\"text\":\"02 Java基础面试专题(中)\",\"link\":\"\\\\01-Dev\\\\01.98-八股\\\\02-Java基础面试专题(中).md\"},{\"text\":\"03 Java基础面试专题(下)\",\"link\":\"\\\\01-Dev\\\\01.98-八股\\\\03-Java基础面试专题(下).md\"},{\"text\":\"2023金九银十面试突击班1_Mysql\",\"link\":\"\\\\01-Dev\\\\01.98-八股\\\\2023金九银十面试突击班1_Mysql.md\"},{\"text\":\"2023金九银十面试突击班2_JVM\",\"link\":\"\\\\01-Dev\\\\01.98-八股\\\\2023金九银十面试突击班2_JVM.md\"},{\"text\":\"2023金九银十面试突击班2_Mysql\",\"link\":\"\\\\01-Dev\\\\01.98-八股\\\\2023金九银十面试突击班2_Mysql.md\"},{\"text\":\"2023金九银十面试突击班_JVM\",\"link\":\"\\\\01-Dev\\\\01.98-八股\\\\2023金九银十面试突击班_JVM.md\"},{\"text\":\"常见问题\",\"link\":\"\\\\01-Dev\\\\01.98-八股\\\\常见问题.md\"},{\"text\":\"并发编程突击班 基础篇\",\"link\":\"\\\\01-Dev\\\\01.98-八股\\\\并发编程突击班-基础篇.md\"},{\"text\":\"并发编程突击班 锁篇\",\"link\":\"\\\\01-Dev\\\\01.98-八股\\\\并发编程突击班-锁篇.md\"},{\"text\":\"并发编程突击班 集合篇\",\"link\":\"\\\\01-Dev\\\\01.98-八股\\\\并发编程突击班-集合篇.md\"},{\"text\":\"经典框架源码面试题\",\"link\":\"\\\\01-Dev\\\\01.98-八股\\\\经典框架源码面试题.md\"},{\"text\":\"网络协议与Netty面试题1\",\"link\":\"\\\\01-Dev\\\\01.98-八股\\\\网络协议与Netty面试题1.md\"},{\"text\":\"网络协议与Netty面试题2\",\"link\":\"\\\\01-Dev\\\\01.98-八股\\\\网络协议与Netty面试题2.md\"},{\"text\":\"网络协议与Netty面试题3\",\"link\":\"\\\\01-Dev\\\\01.98-八股\\\\网络协议与Netty面试题3.md\"},{\"text\":\"金九银十面试突击班3\",\"link\":\"\\\\01-Dev\\\\01.98-八股\\\\金九银十面试突击班3.md\"},{\"text\":\"项目\",\"link\":\"\\\\01-Dev\\\\01.98-八股\\\\项目.md\"}]},{\"text\":\"01.99 PlugIns\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"MybatisCodeHelper离线激活分析\",\"link\":\"\\\\01-Dev\\\\01.99-PlugIns\\\\MybatisCodeHelper离线激活分析.md\"},{\"text\":\"Ob\",\"link\":\"\\\\01-Dev\\\\01.99-PlugIns\\\\ob.md\"},{\"text\":\"Obsidian插件开发\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Obsidian插件开发\",\"link\":\"\\\\01-Dev\\\\01.99-PlugIns\\\\obsidian插件开发\\\\obsidian插件开发.md\"},{\"text\":\"快速入门\",\"link\":\"\\\\01-Dev\\\\01.99-PlugIns\\\\obsidian插件开发\\\\快速入门.md\"}]},{\"text\":\"Site\",\"link\":\"\\\\01-Dev\\\\01.99-PlugIns\\\\site.md\"},{\"text\":\"开发相关\",\"link\":\"\\\\01-Dev\\\\01.99-PlugIns\\\\开发相关.md\"}]},{\"text\":\"Index\",\"link\":\"\\\\01-Dev\\\\index.md\"}]},{\"text\":\"02 Person\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Index\",\"link\":\"\\\\02-Person\\\\index.md\"},{\"text\":\"SEO\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Index\",\"link\":\"\\\\02-Person\\\\SEO\\\\index.md\"}]},{\"text\":\"业务学习\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"00 简介\",\"link\":\"\\\\02-Person\\\\业务学习\\\\00-简介.md\"},{\"text\":\"01 跨境电商独立站 简介\",\"link\":\"\\\\02-Person\\\\业务学习\\\\01-跨境电商独立站-简介.md\"},{\"text\":\"02 跨境电商前置知识\",\"link\":\"\\\\02-Person\\\\业务学习\\\\02-跨境电商前置知识.md\"},{\"text\":\"03 如何快速接手项目\",\"link\":\"\\\\02-Person\\\\业务学习\\\\03-如何快速接手项目.md\"},{\"text\":\"04 跨境物流进出口业务\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"基础扫盲\",\"link\":\"\\\\02-Person\\\\业务学习\\\\04-跨境物流进出口业务\\\\基础扫盲.md\"}]},{\"text\":\"05 订单履约\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"仓配计费\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"组网优先级\",\"link\":\"\\\\02-Person\\\\业务学习\\\\05-订单履约\\\\仓配计费\\\\组网优先级.md\"}]}]},{\"text\":\"07 归因系统\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"简介\",\"link\":\"\\\\02-Person\\\\业务学习\\\\07-归因系统\\\\简介.md\"}]},{\"text\":\"08 营销系统\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"00 营销系统简介\",\"link\":\"\\\\02-Person\\\\业务学习\\\\08-营销系统\\\\00-营销系统简介.md\"},{\"text\":\"01 营销业务相关问题\",\"link\":\"\\\\02-Person\\\\业务学习\\\\08-营销系统\\\\01-营销业务相关问题.md\"},{\"text\":\"02 价格体系\",\"link\":\"\\\\02-Person\\\\业务学习\\\\08-营销系统\\\\02-价格体系.md\"}]},{\"text\":\"10 搜索系统\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"00 简介\",\"link\":\"\\\\02-Person\\\\业务学习\\\\10-搜索系统\\\\00-简介.md\"},{\"text\":\"02.搜广推核心业务链路\",\"link\":\"\\\\02-Person\\\\业务学习\\\\10-搜索系统\\\\02.搜广推核心业务链路.md\"}]},{\"text\":\"11 推荐系统\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"00 《推荐系统从入门到放弃》\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"01 概述\",\"link\":\"\\\\02-Person\\\\业务学习\\\\11-推荐系统\\\\00-《推荐系统从入门到放弃》\\\\01-概述.md\"},{\"text\":\"02 架构设计\",\"link\":\"\\\\02-Person\\\\业务学习\\\\11-推荐系统\\\\00-《推荐系统从入门到放弃》\\\\02-架构设计.md\"}]},{\"text\":\"00 相关书籍\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"《推荐系统技术评估及高效算法》\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"01 概述\",\"link\":\"\\\\02-Person\\\\业务学习\\\\11-推荐系统\\\\00-相关书籍\\\\《推荐系统技术评估及高效算法》\\\\01-概述.md\"}]}]},{\"text\":\"10 买了又买页逻辑\",\"link\":\"\\\\02-Person\\\\业务学习\\\\11-推荐系统\\\\10-买了又买页逻辑.md\"},{\"text\":\"学习资源\",\"link\":\"\\\\02-Person\\\\业务学习\\\\11-推荐系统\\\\学习资源.md\"}]},{\"text\":\"12 广告系统\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"00 广告前置业务知识\",\"link\":\"\\\\02-Person\\\\业务学习\\\\12-广告系统\\\\00-广告前置业务知识.md\"}]},{\"text\":\"13 网红联盟营销\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"00 简介\",\"link\":\"\\\\02-Person\\\\业务学习\\\\13-网红联盟营销\\\\00-简介.md\"},{\"text\":\"01 网红和联盟之间的关系\",\"link\":\"\\\\02-Person\\\\业务学习\\\\13-网红联盟营销\\\\01-网红和联盟之间的关系.md\"}]}]},{\"text\":\"博客搭建\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Github与gitee的同步方案\",\"link\":\"\\\\02-Person\\\\博客搭建\\\\github与gitee的同步方案.md\"},{\"text\":\"Index\",\"link\":\"\\\\02-Person\\\\博客搭建\\\\index.md\"},{\"text\":\"Obs+VitePress+GithubAction实现同步\",\"link\":\"\\\\02-Person\\\\博客搭建\\\\Obs+VitePress+GithubAction实现同步.md\"},{\"text\":\"Rss处理\",\"link\":\"\\\\02-Person\\\\博客搭建\\\\Rss处理.md\"},{\"text\":\"Vitepress 动态目录\",\"link\":\"\\\\02-Person\\\\博客搭建\\\\vitepress 动态目录.md\"},{\"text\":\"VitePress\",\"link\":\"\\\\02-Person\\\\博客搭建\\\\VitePress.md\"},{\"text\":\"需求\",\"link\":\"\\\\02-Person\\\\博客搭建\\\\需求.md\"}]},{\"text\":\"博文成长\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Guide\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"程序人生\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"开发同学须知\",\"link\":\"\\\\02-Person\\\\博文成长\\\\Guide\\\\程序人生\\\\开发同学须知.md\"}]}]},{\"text\":\"Index\",\"link\":\"\\\\02-Person\\\\博文成长\\\\index.md\"},{\"text\":\"个人提升\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"掌握习惯\",\"link\":\"\\\\02-Person\\\\博文成长\\\\个人提升\\\\掌握习惯.md\"}]},{\"text\":\"井底之蛙\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"业务模式\",\"link\":\"\\\\02-Person\\\\博文成长\\\\井底之蛙\\\\业务模式.md\"},{\"text\":\"提前做的思想准备\",\"link\":\"\\\\02-Person\\\\博文成长\\\\井底之蛙\\\\提前做的思想准备.md\"}]}]},{\"text\":\"独立开发者\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Index\",\"link\":\"\\\\02-Person\\\\独立开发者\\\\index.md\"},{\"text\":\"我是谁\",\"link\":\"\\\\02-Person\\\\独立开发者\\\\我是谁.md\"},{\"text\":\"独立开发多人（远程）协作经验分享\",\"link\":\"\\\\02-Person\\\\独立开发者\\\\独立开发多人（远程）协作经验分享.md\"},{\"text\":\"独立开发者的思考\",\"link\":\"\\\\02-Person\\\\独立开发者\\\\独立开发者的思考.md\"},{\"text\":\"资源站点\",\"link\":\"\\\\02-Person\\\\独立开发者\\\\资源站点.md\"}]},{\"text\":\"笔记整理\",\"link\":\"\\\\02-Person\\\\笔记整理.md\"},{\"text\":\"问题思考\",\"collapsible\":true,\"collapsed\":true,\"items\":[{\"text\":\"Obsidian笔记中的标签自闭合问题\",\"link\":\"\\\\02-Person\\\\问题思考\\\\Obsidian笔记中的标签自闭合问题.md\"},{\"text\":\"博客同步问题\",\"link\":\"\\\\02-Person\\\\问题思考\\\\博客同步问题.md\"},{\"text\":\"定时任务注入为null\",\"link\":\"\\\\02-Person\\\\问题思考\\\\定时任务注入为null.md\"}]}]}],\"footer\":{\"message\":\"waitingresult.com\",\"copyright\":\"Copyright © 2024 Luyuan\"},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/luyuan9870\"},{\"icon\":{\"svg\":\"<svg t=\\\"1710470546803\\\" class=\\\"icon\\\" viewBox=\\\"0 0 1024 1024\\\" version=\\\"1.1\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" p-id=\\\"1442\\\" width=\\\"200\\\" height=\\\"200\\\"><path d=\\\"M512 512m-494.933333 0a494.933333 494.933333 0 1 0 989.866666 0 494.933333 494.933333 0 1 0-989.866666 0Z\\\" fill=\\\"#C71D23\\\" p-id=\\\"1443\\\"></path><path d=\\\"M762.538667 457.045333h-281.088a24.4736 24.4736 0 0 0-24.439467 24.405334v61.098666c-0.034133 13.5168 10.922667 24.439467 24.405333 24.439467h171.1104c13.5168 0 24.439467 10.922667 24.439467 24.439467v12.219733a73.3184 73.3184 0 0 1-73.3184 73.3184h-232.209067a24.439467 24.439467 0 0 1-24.439466-24.439467v-232.174933a73.3184 73.3184 0 0 1 73.3184-73.3184h342.152533c13.482667 0 24.405333-10.922667 24.439467-24.439467l0.034133-61.098666a24.405333 24.405333 0 0 0-24.405333-24.439467H420.352a183.296 183.296 0 0 0-183.296 183.296V762.538667c0 13.482667 10.922667 24.439467 24.405333 24.439466h360.516267a164.9664 164.9664 0 0 0 165.000533-165.000533v-140.526933a24.439467 24.439467 0 0 0-24.439466-24.439467z\\\" fill=\\\"#FFFFFF\\\" p-id=\\\"1444\\\"></path></svg>\"},\"link\":\"https://gitee.com/luyuan9870\"}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
    
  </body>
</html>